单元测试时,如何从异步方法模拟返回null?

Scu*_*eve 9 c# unit-testing moq async-await asp.net-mvc-5

通常情况下,我这样嘲笑我的回购:

var repository = new Mock<ISRepository>();
repository.Setup(r => r.GetMemberAsync(email))
    .Returns(Task.FromResult(new Member
    {
        FirstName = firstName,
        LastName = lastName
    }));
Run Code Online (Sandbox Code Playgroud)

但是,在我的代码中,我检查是否找不到该成员,即GetMemberAsync返回null.我该如何嘲笑这个?

我试过了:

var repository = new Mock<ISRepository>();
repository.Setup(r => r.GetMemberAsync(email))
    .Returns(Task.FromResult<object>(null));
Run Code Online (Sandbox Code Playgroud)

但是我收到编译错误.

i3a*_*non 29

您收到编译器错误,因为您返回的任务与async方法返回的类型不匹配.你应该返回Task<Member>而不是简单地Task<object>:

repository.Setup(r => r.GetMemberAsync(email)).Returns(Task.FromResult<Member>(null));
Run Code Online (Sandbox Code Playgroud)

  • 或者,您可以将 `null` 转换为您想要的类型 - `Task.FromResult((Member)null)`(在 `FromResult` 情况下并不完全有用,但当类型更复杂时可能会很方便)。 (3认同)

Mar*_*ijk 15

也可以在不使用 Task 类的情况下返回结果。

repository
    .Setup(r => r.GetMemberAsync(email))
    .ReturnsAsync((Member)null);
Run Code Online (Sandbox Code Playgroud)