我似乎找不到一个针对这个问题的.NET答案,但我认为这应该是相当常见的。
单元测试异步方法的最佳模式是什么?
显然,我需要调用方法,然后看回调是否触发,但除了简单地睡一会儿然后检查回调设置的标志外,还有更好的方法吗?在多个测试运行时管理标志会变得有些混乱。
我似乎找不到一个针对这个问题的.NET答案,但我认为这应该是相当常见的。
单元测试异步方法的最佳模式是什么?
显然,我需要调用方法,然后看回调是否触发,但除了简单地睡一会儿然后检查回调设置的标志外,还有更好的方法吗?在多个测试运行时管理标志会变得有些混乱。
我通常使用匿名委托和等待句柄。例如,我的Presenter中有一个名为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);
}