let*_*tbe 18 c# asynchronous nsubstitute async-await
当我运行以下代码时:
[Test]
public async Task Can_Test_Update()
{
var response = await _controller.UpdateAsync(Guid.NewGuid());
response.Valid.Should().BeTrue();
_commands.Received().UpdateAsync(
Arg.Is<Something>(
l => l.Status == Status.Updated));
}
Run Code Online (Sandbox Code Playgroud)
如果我在" await
"之前添加" " _commands.Received().UpdateAsync
,它会抛出一个空引用异常.我怎样才能阻止这种情况发生,或者await
不是必要的?
let*_*tbe 16
我在这里找到了答案.
Received.InOrder(async () =>
{
await _Commands.UpdateAsync(Arg.Is<Lobby>(l => l.Status == Status.Updated));
});
Run Code Online (Sandbox Code Playgroud)
当NSubstitute看到异步调用时,它会自动创建一个已完成的任务,因此await的工作方式与您在代码中的预期相同(而不是抛出NullReferenceException).在这种情况下,这将是_commands.UpdateAsync(Status.Updated))
您正在测试的方法内部返回的任务.
.Received()
另一方面,调用是验证异步方法是否被调用,即完全同步,因此不需要等待.
要记住的关键是异步方法返回一个Task
.调用异步方法并返回任务是完全同步的,然后等待Task
知道任务所代表的异步操作何时完成.
显然你可以简单地使用await
以下Received
方法:
[Test]
public async Task Can_Test_Update()
{
var response = await _controller.UpdateAsync(Guid.NewGuid());
response.Valid.Should().BeTrue();
await _commands.Received().UpdateAsync(
Arg.Is<Something>(
l => l.Status == Status.Updated));
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8177 次 |
最近记录: |