通过测试方法传递空对象

时间:2018-07-04 05:08:58

标签: c# unit-testing code-coverage mstest

我有一个类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()方法编写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);
}

我想做的是将order对象设置为null并将null对象传递给构造函数。但这会引发一些错误“发现歧义匹配”。显然,传递null值在这里不起作用。任何人都可以告诉我其他方法来测试else块。

PS:我需要同时测试if和else块,以便将其包括在代码覆盖率中。

3 个答案:

答案 0 :(得分:1)

如果您的代码是真实的,那么实际上就不需要模拟正在测试的服务。

这很好用:

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

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

    //Assert
    Assert.IsFalse(result);
}

答案 1 :(得分:0)

好吧,单元测试用例和您共享的代码没有任何问题

您没有返回任务,并且错误“发现模糊匹配” 似乎来自在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;
        }

答案 2 :(得分:0)

您必须从“ GetData()”返回

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