【问题标题】:create async unit test throws aggregate exception创建异步单元测试引发聚合异常
【发布时间】:2015-04-10 13:33:55
【问题描述】:

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

目前我收到了'System.AggregateException'

我已经读过我不应该用 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);

}

【问题讨论】:

  • 我认为您需要查看聚合异常以了解根本原因是什么。
  • "I have read that I should not mark a test method with asnyc and prefix the SUT with 'await' because then the assertion will fail as the result is not yet returned" - 你在哪里读到的?等待任务将做到这一点......等待它。在任务完成之前,断言不会执行。至于例外情况,详情如何?哪一行抛出异常?聚合的内部异常是什么? “我遇到异常”不足以诊断问题。
  • @David 但是我的测试同步运行正确吗?因为它等待......
  • @Pascal:如果测试运行者也在等待测试,是的。但是你并没有真正控制测试运行器,所以这不值得担心。 (另外,这与当前的实现有何不同?)关键是异步应该是“一直异步”,这意味着消费代码也应该是异步的,并且应该由应用程序主机来确定同步来电。

标签: c# async-await c#-5.0


【解决方案1】:

您应该使用asynchronous unit test methods,正如我在 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 将避免使用 AggregateException 包装器,让您更轻松地确定单元测试失败的原因。

【讨论】:

  • 我现在使用 CreateViewModel().GetAwaiter().GetResult(); 在没有 async/await 的情况下进行了单元测试;这和你的代码有什么区别?
  • 您的单元测试阻塞了异步代码。一路使用异步更自然。
  • 但是当我使用更自然的方式在测试方法上使用异步时,一个测试可能期望数据库中有某些数据,而另一个测试已经删除了这些数据。一个类中多个单元测试的运行时依赖关系如何?
  • @Pascal:最好的方法是模拟你的数据库层,这样你的测试就不会触及数据库。请注意,使用 MSTest,默认情况下所有测试同时运行,无论它们是同步的还是异步的。所以即使你屏蔽了,你也会遇到同样的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
相关资源
最近更新 更多