【问题标题】:Ensuring background thread execution is ran given enough time to finish when running unit test in .Net在 .Net 中运行单元测试时,确保运行后台线程执行有足够的时间来完成
【发布时间】:2012-03-19 10:23:29
【问题描述】:

我的 NUnit 测试创建了一个被测类的实例。该类的构造函数跨越两个未完成操作的后台(旧式Thread t = new Thread(myvoidreturner);)任务,因为实际测试如果较早完成并且对象被释放,我猜想清除后台线程执行。

有没有办法让我的班级在运行测试内容后不被释放,以确保后台任务完成?

【问题讨论】:

  • 抛开可能的设计问题不谈,你可以在你的类中公开一个 Wait() 方法,并在你的后台线程内部公开 Join()。
  • 您的意思是“丢弃”还是“收集垃圾”?

标签: .net multithreading unit-testing dispose


【解决方案1】:

有没有办法让我的班级在 运行测试的东西,以确保后台任务完成?

您可能在此处遇到一些设计问题。 Dispose 通常应该是单元测试中最后调用的东西(除非您专门测试 Dispose)。此时测试应该已经报告失败或即将通过。通过调用Dispose,您,开发人员,表示不再需要使用该类。如果您不再需要使用该类,那么为什么提前终止后台任务很重要。你明白我的意思吗?

如果您的类上有特定操作依赖于这些后台任务的完成,则用于调用该操作的方法应在内部等待这些任务完成后再继续。这将导致该方法阻塞,进而导致您的测试代码也阻塞。如果被测试的方法是异步的,那么你的类应该公开一个等待操作完成的机制。

【讨论】:

  • 最后一句话说明了我的需要。它可以是一种什么样的机制?就像在处理被测对象之前调用myCallInstance.WaitToBackgroundThreadToFinish() 同步方法一样?里面会是什么?如何锁定等待类内部的其他后台线程?
  • 我想你可能错过了我的意思。如果您需要在 Dispose 之前调用 WaitToBackgroundThreadToFinish 方法以使您的类正常工作,那么您的设计可能有问题。
【解决方案2】:

我刚刚听说过 PNUnit,所以您可以检查它是否有可以使用的东西,否则您可以简单地枚举每个后台线程并对其执行 Thread.Join。

【讨论】:

    【解决方案3】:

    您可以为您的测试提供一个TearDown 方法,该方法会延迟测试完成,直到后台工作处理完毕。

    【讨论】:

      猜你喜欢
      • 2021-03-29
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 2015-03-25
      相关资源
      最近更新 更多