单元测试时,如何从异步方法模拟 return null?
When unit testing, how do I mock a return null from async method?
通常,我会像这样模拟我的回购协议:
var repository = new Mock<ISRepository>();
repository.Setup(r => r.GetMemberAsync(email))
.Returns(Task.FromResult(new Member
{
FirstName = firstName,
LastName = lastName
}));
但是,在我的代码中,我检查是否找不到该成员,即 GetMemberAsync returns null。我该如何模拟这个?
我试过了:
var repository = new Mock<ISRepository>();
repository.Setup(r => r.GetMemberAsync(email))
.Returns(Task.FromResult<object>(null));
但是我得到一个编译错误。
您收到编译器错误,因为您 return 的任务与异步方法 return 的类型不匹配。你应该 return Task<Member>
而不是简单地 Task<object>
:
repository.Setup(r => r.GetMemberAsync(email)).Returns(Task.FromResult<Member>(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>));
也可以在不使用任务 class 的情况下 return 结果。
repository
.Setup(r => r.GetMemberAsync(email))
.ReturnsAsync((Member)null);
通常,我会像这样模拟我的回购协议:
var repository = new Mock<ISRepository>();
repository.Setup(r => r.GetMemberAsync(email))
.Returns(Task.FromResult(new Member
{
FirstName = firstName,
LastName = lastName
}));
但是,在我的代码中,我检查是否找不到该成员,即 GetMemberAsync returns null。我该如何模拟这个?
我试过了:
var repository = new Mock<ISRepository>();
repository.Setup(r => r.GetMemberAsync(email))
.Returns(Task.FromResult<object>(null));
但是我得到一个编译错误。
您收到编译器错误,因为您 return 的任务与异步方法 return 的类型不匹配。你应该 return Task<Member>
而不是简单地 Task<object>
:
repository.Setup(r => r.GetMemberAsync(email)).Returns(Task.FromResult<Member>(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>));
也可以在不使用任务 class 的情况下 return 结果。
repository
.Setup(r => r.GetMemberAsync(email))
.ReturnsAsync((Member)null);