从测试方法传递空对象

3

我有一个名为Class1的类,它有一个构造函数和几个方法。为这些方法编写单元测试用例时,我使用了MSTest。这个类看起来像这样。

class Class1
{
    Order order = new Order(); // there is an class Order
    public Class1(Order _order)
    {
        order = _order;
    }
    public virtual async Task<bool> GetData()
    {
        if(order != null)
        {
            //do something
        }
        else
        {
            // do something else
        }
    }
}

现在,我必须为这个GetData()方法编写两个测试用例,其中一个测试if块,另一个测试else块。我已经成功地测试了if块,但是无法测试else块。我尝试编写的测试方法如下。

[TestMethod()]
public void GetDataTest()
{
    Order order = new Order();
    order = null;
    var mockService = new Mock<Class1>(order)
    {
        CallBase = true
    };
    var result = await mockService.Object.GetData(); // error thrown from here
    Assert.IsFalse(result);
}

我想要做的是将订单对象设置为null并将null对象传递给构造函数。但是这会抛出一些错误 "找到多个匹配项"。显然,在这里传递null值不起作用。那么有谁能告诉我其他的解决方法来测试else块呢?
PS:我需要测试if和else块,以便包含在代码覆盖范围内。

但是这会抛出一个错误 "Ambiguous match found"。请提供确切的错误消息,并说明它是在编译时还是执行时发生的,以及在代码中的位置。最好提供一个 [mcve],这样我们就可以复制/粘贴/编译并查看问题。 - Jon Skeet
@DaisyShipton 这是一个执行时间错误。确切的错误信息是“system.reflection.ambiguousmatchexception: ambiguous match found.”我已经编辑了代码,以显示错误抛出的位置。 - CrazyCoder
好的,如果这是一个异常,请包含完整的堆栈跟踪 - 这将有助于澄清正在尝试使用反射匹配什么。 - Jon Skeet
3个回答

2
如果你的代码是真实的,那么实际上就不需要在测试中使用模拟服务。
这样做完全没问题:
[TestMethod]
public async Task GetDataTest()
{
    //Arrange
    Order order = null;
    var c1 = new Class1(order);

    //Act
    var result = await c1.GetData();

    //Assert
    Assert.IsFalse(result);
}

谢谢回复。在我的情况下,我不需要使用模拟对象。但是如果在GetData()中有一个方法调用,并且我必须模拟该调用方法,那么我将不得不使用模拟对象。在这种情况下我该怎么办? - CrazyCoder
1
请检查以下代码(使用nsubstitute):https://paste.ubuntu.com/p/Xcyn9FRvrM/ - Nicklaus Brain

0

好的,你分享的单元测试用例和代码没有任何问题。

除了

你没有返回一个任务,并且错误 "ambiguous match found" 看起来是来自于 else 块内部编写的代码。

尝试将你的 GetData() 方法更改为:

public virtual async Task<bool> GetData()
        {
            TaskCompletionSource<bool> ts = new TaskCompletionSource<bool>();
            if (order != null)
            {
                //do something
                ts.SetResult(true);
            }
            else
            {
                // do something else
                ts.SetResult(false);
            }
            return await ts.Task;
        }

0

你必须从“GetData()”返回

public virtual async Task<bool> GetData()    
{
    if(order != null)
    {
        //do something
    }
    else
    {
        // do something else
    }
//return task here with await keyword;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接