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

本文关键字:模拟 异步方法 null 返回 单元测试 何模拟 | 更新日期: 2023-09-27 18:19:25

通常,我是这样嘲笑我的repo的:

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));

但是我得到一个编译错误

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

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

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

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

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

老问题但是你也可以这样做,我认为这样更简洁:

假设你的对象的默认值是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>));