Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建异步单元测试引发聚合异常_C#_Async Await_C# 5.0 - Fatal编程技术网

C# 创建异步单元测试引发聚合异常

C# 创建异步单元测试引发聚合异常,c#,async-await,c#-5.0,C#,Async Await,C# 5.0,要使这个异步单元正确运行,我需要做哪些更改 现在我得到了一个“System.aggregateeexception” 我已经读到,我不应该用asnyc标记测试方法,并在SUT前面加上'await',因为这样断言就会失败,因为结果还没有返回 [TestMethod] public void CreateAsyncViewModel() { // other stuff var result = vmMapper.CreateViewModel(mock1,mock2);

要使这个异步单元正确运行,我需要做哪些更改

现在我得到了一个
“System.aggregateeexception”

我已经读到,我不应该用asnyc标记测试方法,并在SUT前面加上'await',因为这样断言就会失败,因为结果还没有返回

[TestMethod]
public void CreateAsyncViewModel()
{
    // other stuff
    var result =  vmMapper.CreateViewModel(mock1,mock2);
    result.Wait();

    var viewModel = result.Result;

    Assert.AreEqual(viewModel.Data.Count(), 1);

}
正如我在MSDN文章中所描述的,您应该使用:

[TestMethod]
public async Task CreateAsyncViewModel()
{
  // other stuff
  var result =  vmMapper.CreateViewModel(mock1, mock2);

  var viewModel = await result;

  Assert.AreEqual(viewModel.Data.Count(), 1);
}

await
将避免使用
aggregateeexception
包装,使您能够更轻松地确定单元测试失败的原因。

我认为您需要查看聚合异常内部,以了解根本原因。
“我已经读到,我不应该用asnyc标记一个测试方法,并在SUT前面加上'await',因为这样断言就会失败,因为结果还没有返回“
-你在哪里读到的?等待任务就可以做到这一点。。。等待它。在任务完成之前,不会执行断言。至于例外情况,详情是什么?哪一行抛出异常?聚合的内部异常是什么?“我遇到异常”不足以诊断问题。@David但我的测试运行完全正确吗?因为它在等待…@Pascal:如果测试运行者也在等待测试,那么是的。但是你不能真正控制测试跑步者,所以这不值得担心。(还有,这与当前的实现有什么不同?)重点是async应该是“一路异步”,这意味着消费代码也应该是异步的,应该由应用程序主机来确定调用的同步。我现在使用CreateViewModel().GetAwaiter在没有async/await的情况下进行了单元测试().GetResult();与您的代码有什么区别?您的单元测试在异步代码上阻塞。始终使用异步更自然。但是当我在测试方法上使用更自然的方式使用异步时,一个测试可能会在数据库中预期某些数据,而另一个测试则删除了这些数据。mul的运行时依赖关系如何tiple在一个类中进行单元测试?@Pascal:最好的方法是模拟您的数据库层,这样您的测试就不会触及数据库。请注意,使用MSTest,默认情况下,所有测试都同时运行,而不管它们是同步的还是异步的。因此,即使您阻塞了,您也会遇到同样的问题。