代码之家  ›  专栏  ›  技术社区  ›  Rasmus Faber

C/.NET:使用Nunit测试后台工作人员

  •  2
  • Rasmus Faber  · 技术社区  · 15 年前

    此测试在使用nunit控制台运行程序运行时失败。如果我只使用testsdriven.net运行该测试,那么它是有效的,但是如果我使用testsdriven.net运行整个套件,那么它是无效的:

    [Test]
    public void BackgroundWorkerFiresRunWorkerCompleted()
    {
      var runner = new BackgroundWorker();
      ManualResetEvent done = new ManualResetEvent(false);
      runner.RunWorkerCompleted += delegate { done.Set(); };
    
      runner.RunWorkerAsync();
    
      bool res = done.WaitOne(TimeSpan.FromSeconds(10));
      // This assert fails:
      Assert.IsTrue(res, "RunWorkerCompleted was not executed within 10 seconds");
    }
    

    我怀疑问题与没有消息循环有关,但我不确定。

    使用BackgroundWorker有什么要求?

    是否有解决方法使测试工作正常?

    3 回复  |  直到 14 年前
        1
  •  7
  •   Lucero    15 年前

    我不认为这与消息泵有关,因为测试通常以阻塞的方式运行。但可能是在“ui”线程上调用了事件,该线程使用的是一条未被处理的Windows消息。

    因此,如果问题是消息泵或Windows消息未被处理,您可以尝试这样来替换当前的 bool res = done.WaitOne(TimeSpan.FromSeconds(10)); 线:

    DateTime end = DateTime.Now.AddSeconds(10);
    bool res = false;
    while ((!res) && (DateTime.Now<end)) {
       Application.DoEvents();
       res = done.WaitOne(0):
    }
    
        2
  •  0
  •   Noel Kennedy    15 年前

    是否缺少BGW DoWork事件处理程序?

        3
  •  -2
  •   Georgios Paraskevas    14 年前

    在您的:

    Assert.IsTrue(res, "RunWorkerCompleted was not executed within 10 seconds");

    像这样:

    System.Threading.Thread.Sleep(10000);