单元测试异步方法的最佳方法是什么?

时间:2008-12-30 15:28:18

标签: multithreading unit-testing

我似乎无法找到这个问题的.NET答案,我认为这个问题相当常见 单元测试异步方法的最佳模式是什么?

显然我需要调用该方法然后查看回调是否会触发,但是有没有比简单地稍微休眠然后检查由回调设置的标志更好的方法?在有多个测试运行的情况下,管理标志会有点混乱。

3 个答案:

答案 0 :(得分:10)

我通常使用匿名委托和等待句柄。例如,我在我的演示者中有一个名为SetRemoteTableName的函数。设置名称后,它还会引发一个事件。我想测试那个异步引发的事件。测试看起来像这样:

[TestMethod]
[WorkItem(244)]
[Description("Ensures calling SetRemoteTableName with a valid name works 
              AND raises the RemoteTableNameChange event")]
public void SetRemoteTableNamePositive()
{
  string expected = "TestRemoteTableName";
  string actual = string.Empty;

  AutoResetEvent are = new AutoResetEvent(false);
  SQLCECollectorPresenter presenter = new SQLCECollectorPresenter();
  presenter.RemoteTableNameChange += new EventHandler<GenericEventArg<string>>(
    delegate(object o, GenericEventArg<string> a)
    {
      actual = a.Value;
      are.Set();
    });

  presenter.SetRemoteTableName(expected);
  Assert.IsTrue(are.WaitOne(1000, false), "Event never fired");
  Assert.AreEqual(actual, expected);
}

答案 1 :(得分:2)

拆分代码,使逻辑位于由精简异步包装器调用的同步代码位中。

然后,大多数单元测试都可以测试同步代码。

答案 2 :(得分:1)

  

有没有比简单地休眠一下然后检查回调设置的标志更好的方法?

用等号句柄替换标志。而不是设置标志,设置等待句柄。而不是睡觉,然后检查是否设置了标志,等待等待句柄...并等待超时,这样如果你因为计时器到期而不是醒来而醒来,因为你正在等待的句柄被解雇通过回调,你就知道测试失败了(即在超时期限内没有调用回调)。