首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在异步方法上使用Verifyable的UnitTest中的NullReferenceException

在异步方法上使用Verifyable的UnitTest中的NullReferenceException
EN

Stack Overflow用户
提问于 2018-12-21 18:10:12
回答 1查看 489关注 0票数 0

我在使用xUnitMoq设置单元测试时遇到了一个问题。

我的被测试者

方法TestMethod()包含了逻辑,我想测试一下。它是异步的,虽然返回一个Task

代码语言:javascript
复制
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如下所示

代码语言:javascript
复制
public interface IDoSomething
{
    Task DoAsync(bool aboolean);
}

单元测试

现在我像这样设置我的Unit-Test。

代码语言:javascript
复制
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);
    }
}

为什么我会得到这个异常?

EN

回答 1

Stack Overflow用户

发布于 2018-12-21 18:10:12

mock.Setup()缺少返回值并返回null。因此,在TestMethod()中,_doSomething.DoAsync(true)返回的Tasknull。等待null,这当然会导致System.NullReferneceException

要解决这个问题,我建议将.Returns(Task.CompletedTask)添加到模拟设置中。

代码语言:javascript
复制
mock.Setup(x => x.DoAsync(It.IsAny<bool>())).Returns(Task.CompletedTask).Verifiable();

当使用Awaiter模式编译await时,现在有一个任务可以在它上面调用.GetAwaiter(),以返回一个TaskAwaiter。这些原则在这里有更好的解释:

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53882817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档