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
调用仅在一次一个线程的上下文中是一个问题。