【发布时间】:2021-04-06 13:14:17
【问题描述】:
我和我的解决方案架构师正在讨论对异步代码进行单元测试的正确方法。
他更喜欢用void [Test]方法,而断言Task.Result,而我觉得异步方法应该用async/await [Test]方法测试。
不知何故,我觉得使用 Task.Result 是测试异步代码的不正确方法,但无法证明或准确指出原因?
例如,给定以下代码:
public class SomeService
{
public async Task<bool> ProcessSomething(string request)
{
return await Repository.Save(request);
}
}
方法一:Task.Result
[Test]
public void ServiceProcessTest()
{
var sut = new SomeService();
// Use Task.Result
var unusedResult= sut.ProcessSomething("Hello world!").Result;
A.CallTo(() => Repository.Save(A<string>>.Ignored)).MustHaveHappenedOnceExactly();
}
方法二:异步/等待
[Test]
public async Task ServiceProcessTest()
{
var sut = new SomeService();
// Use async/await
var unusedResult= await sut.ProcessSomething("Hello world!");
A.CallTo(() => Repository.Save(A<string>>.Ignored)).MustHaveHappenedOnceExactly();
}
我们应该使用哪一次,为什么? 如果两者都是正确的,那么有没有时候一个比另一个更受欢迎?
【问题讨论】:
-
async-await是记录在案的做法,因为Task.Result会导致死锁 -
与任何方法的任何方面一样,您应该以您使用它的方式对其进行测试,否则您的测试无法帮助您验证它在您关心的情况下是否能正常工作。如果您的测试测试的行为与您的生产代码使用的行为不同,那么这些测试不会增加任何价值。
-
@Nkosi:是的,我确实查看了 Microsoft 文档,但它并没有否认使用 Task.Result(或者我可能错过了它)。
标签: c# unit-testing asynchronous async-await nunit