我有一个类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块,以便将其包括在代码覆盖率中。
答案 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;
}