我在使用xUnit和Moq设置单元测试时遇到了一个问题。
我的被测试者
方法TestMethod()包含了逻辑,我想测试一下。它是异步的,虽然返回一个Task
public class Testee
{
private readonly IDoSomething _doSomething;
public Testee(IDoSomething doSomething)
{
_doSomething = doSomething;
}
public async Task TestMethod()
{
await _doSomething.DoAsync(true); // throws NullReferenceException in Unit-Test
}
}接口IDoSomething如下所示
public interface IDoSomething
{
Task DoAsync(bool aboolean);
}单元测试
现在我像这样设置我的Unit-Test。
public class TesteeTest
{
[Fact]
public async Task MyTest()
{
var mock = new Mock<IDoSomething>();
mock.Setup(x => x.DoAsync(It.IsAny<bool>())).Verifiable();
var testee = new Testee(mock.Object);
await testee.TestMethod(); // Test breaks here because it throws an exception
mock.Verify(x => x.DoAsync(true), Times.Once);
mock.Verify(x => x.DoAsync(false), Times.Never);
}
}为什么我会得到这个异常?
发布于 2018-12-21 18:10:12
mock.Setup()缺少返回值并返回null。因此,在TestMethod()中,_doSomething.DoAsync(true)返回的Task是null。等待null,这当然会导致System.NullReferneceException。
要解决这个问题,我建议将.Returns(Task.CompletedTask)添加到模拟设置中。
mock.Setup(x => x.DoAsync(It.IsAny<bool>())).Returns(Task.CompletedTask).Verifiable();当使用Awaiter模式编译await时,现在有一个任务可以在它上面调用.GetAwaiter(),以返回一个TaskAwaiter。这些原则在这里有更好的解释:
https://stackoverflow.com/questions/53882817
复制相似问题