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

时间:2015-10-26 22:34:17

标签: c# unit-testing asp.net-mvc-5 async-await moq

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

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

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

我试过了:

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

但是我收到了编译错误。

3 个答案:

答案 0 :(得分:23)

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

repository.Setup(r => r.GetMemberAsync(email)).Returns(Task.FromResult<Member>(null));

答案 1 :(得分:9)

也可以不使用Task类而返回结果。

repository
    .Setup(r => r.GetMemberAsync(email))
    .ReturnsAsync((Member)null);

答案 2 :(得分:0)

古老的问题,但您也可以这样做,我认为它更干净:

假设您对象的默认值为null,那么您也可以使用:

default(<insert object type here>)

例如

default(Member)
default(List<string>)
etc.

完整示例:

var myRepo = new Mock<IMyRepo>();
myRepo 
    .Setup(p => p.GetAsync("name"))
    .ReturnsAsync(default(List<string>));
相关问题