C# 为什么一个人需要;异步;是否支持MS单元测试任务。是否可以使用结果?

C# 为什么一个人需要;异步;是否支持MS单元测试任务。是否可以使用结果?,c#,.net,unit-testing,async-await,C#,.net,Unit Testing,Async Await,我在这里有点困惑…我有一个测试方法,它调用一个异步方法,我将签名更改为async Task。工作 [TestMethod] public async Task TestIt() { bool result = await service.SomethingAsync(); Assert(result); } 现在我在网上看到,单元测试需要支持异步,NUnit也需要支持异步。但这为什么如此重要?我可以这样编写测试,使用Result属性等待任务完成: [TestMethod] public

我在这里有点困惑…我有一个测试方法,它调用一个异步方法,我将签名更改为
async Task
。工作

[TestMethod]
public async Task TestIt()
{
  bool result = await service.SomethingAsync();
  Assert(result);
}
现在我在网上看到,单元测试需要支持异步,NUnit也需要支持异步。但这为什么如此重要?我可以这样编写测试,使用
Result
属性等待
任务完成:

[TestMethod]
public void TestIt()
{
  bool result = service.SomethingAsync().Result;
  Assert(result);
}

Result
有一个不幸的副作用,就是将所有异常包装在
aggregateeexception
中。这使得测试错误路径更加痛苦

但是,即使您决定可以接受它,您仍然存在在单个测试中调用多个
async
方法的问题;i、 例如,如果您的测试设置还需要
async
工作。要以阻塞的方式执行,您必须将测试方法重构为一个单独的
async
方法,或者将其封装在
async
委托中,并直接执行它或将其放入
任务中。运行
。不是不可能,但也不方便

最后,还有
async
组件的问题,这些组件采用一次一个线程的上下文。示例包括ViewModels和WebAPI/MVC控制器。在这个级别上,这些组件通常假定它们不需要同步对异步共享数据的访问,因为它们从未在自由线程上下文中执行。在单元测试之前,就是这样。常用的方法是为那些单元测试提供一个单线程上下文,例如,在单元测试线程上安装一个
Dispatcher
。在这种情况下,
结果将死锁。有很多方法可以解决这个问题,但同样,编写代码并不方便


底线是
async
单元测试无法实现这一点;他们使它方便。任何鼓励单元测试的东西(特别是对于像
async
)都是一个好主意

我不理解“一个测试中有多个异步方法”的部分:结果方法不是同步执行方法吗?因此,有多个调用应该无关紧要?我正好有这个案例,测试方法完成得很好。@Krumelur:是的,这是正确的。我在超越自己;多个
async
调用仅在一次一个线程的上下文中是一个问题。