我似乎無法找到這個問題的.NET答案,我認爲這將是相當普遍的。
單元測試異步方法的最佳模式是什麼?單元測試異步方法的最佳方法是什麼?
很明顯,我需要調用該方法,然後看看回調是否觸發,但是有沒有比簡單地睡一會然後檢查回調設置的標誌更好的方法?在有多個測試運行的地方,管理標誌會有點混亂。
我似乎無法找到這個問題的.NET答案,我認爲這將是相當普遍的。
單元測試異步方法的最佳模式是什麼?單元測試異步方法的最佳方法是什麼?
很明顯,我需要調用該方法,然後看看回調是否觸發,但是有沒有比簡單地睡一會然後檢查回調設置的標誌更好的方法?在有多個測試運行的地方,管理標誌會有點混亂。
我通常使用匿名委託和等待句柄。例如我在我的演示器中有一個名爲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);
}
拆分代碼,以便邏輯位於由瘦異步封裝器調用的代碼的同步位中。
然後,大多數單元測試可以測試同步代碼。
有沒有比簡單的休息一下再檢查一個由回調設置的標誌更好的方法?
用等待句柄替換該標誌。而不是設置標誌,設置等待句柄。而不是睡覺,然後檢查是否設置標誌,等待等待處理...並等待超時,以便如果您由於定時器到期而醒來,而不是因爲您等待的句柄被解除而醒來通過回調,那麼你知道測試失敗了(即在超時期內沒有調用回調)。
這真是太棒了 - 謝謝! – womp 2009-05-13 20:36:05