从测试方法传递空对象

Passing the null object from a test method

我有一个 class Class1,它有一个构造函数和一些方法。对于这些方法,我正在使用 MSTest 编写单元测试用例。 class 看起来像这样。

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() 方法编写 2 个测试用例,一个测试 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 对象传递给 constructor.But 这会引发一些错误 "Ambiguous match found"。显然传递空值在这里不起作用。所以任何人都可以告诉我任何其他解决方法来测试 else 块。

PS:我需要测试 if 和 else 块,以便它包含在代码覆盖率中。

如果您的代码是真实的,那么实际上没有必要模拟被测服务。

这很好用:

[TestMethod]
public async Task GetDataTest()
{
    //Arrange
    Order order = null;
    var c1 = new Class1(order);

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

    //Assert
    Assert.IsFalse(result);
}

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

除了

您没有返回任务,错误 "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;
        }

您必须 return 来自 "GetData()"

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