【问题标题】:How can I queue a background task from a unit test in confidence it'll complete?如何从单元测试中对后台任务进行排队,以确保它会完成?
【发布时间】:2018-02-23 17:10:28
【问题描述】:

我们有一组集成测试,它们在数据库中创建数据,并且需要清理数据作为拆卸的一部分。我知道数据对于特定测试始终是唯一的,因此不会影响后续测试。因此,我想在后台线程中处理这些数据的清理工作,以减少对其他测试的影响。

我不情愿地尝试包含System.Web 程序集并使用HostingEnvironment.QueueBackgroundWorkItem 来执行此操作,但怀疑这不起作用:

System.InvalidOperationException: '由于对象的当前状态,操作无效。'

我尝试将我的代码放在异步方法中,而不是等待,但怀疑测试已完成并在完成拆卸之前终止了该过程。

那么实现我的目标的最佳方法是什么?

【问题讨论】:

  • 您不能使用HostingEnvironment.QueueBackgroundItem,因为您没有在 ASP.NET 上下文中运行。
  • 有一种方法可以同时运行 nunit 测试,但我不知道它是否也适用于 TearDown:github.com/nunit/docs/wiki/Parallelizable-Attribute

标签: c# asp.net multithreading unit-testing


【解决方案1】:

如果您使用 XUnit 或 MSTest,您可以拥有 async 测试方法,但它们必须返回 Task 对象:

[TestMethod]
public async Task TestFooAsync() {

     Int32 someValue = await someSource.GetValueAsync();
     Assert( 123, someValue );
}

使用async void 表示“即发即弃”,这就是为什么它应该只用于事件处理程序,而不是测试。

【讨论】:

    猜你喜欢
    • 2014-02-14
    • 2012-08-18
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 2016-05-24
    • 2010-12-12
    相关资源
    最近更新 更多