我有一個看起來像這樣的方法:單元測試方法與本地線程
protected void OnBarcodeScan(BarcodeScannerEventArgs e)
{
// We need to do this on a seperate thread so we don't block the main thread.
ThreadStart starter =() => SendScanMessage(e, _scanDelegates);
Thread scanThread = new Thread(starter);
scanThread.Start();
}
然後線程熄滅,做一些邏輯(和結束調用在我的測試委託)。
我的問題是我的單元測試在線程完成之前完成。所以我的測試失敗了。
我可以在System.Threading.Thread.Sleep(1000);
中加上,希望邏輯永遠不會超過一秒(它不應該)。但是,這似乎是一個黑客。
問題是我不想將該線程暴露給外部世界甚至是其他課程。
是否有一些很酷的方式來再次找到該線程,並在我的單元測試中等待它?
事情是這樣的:
[TestMethod]
[HostType("Moles")]
public void AddDelegateToScanner_ScanHappens_ScanDelegateIsCalled()
{
// Arrange
bool scanCalled = false;
MCoreDLL.GetTopWindow =() => (new IntPtr(FauxHandle));
// Act
_scanner.AddDelegateToScanner(_formIdentity, ((evnt) => { scanCalled = true; }));
_scanner.SendScan(new BarcodeScannerEventArgs("12345678910"));
// This line is fake!
System.Threading.Thread.CoolMethodToFindMyThread().Join();
// Assert
Assert.IsTrue(scanCalled);
}
我明明做了CoolMethodToFindMyThread方法。但是有一些爲什麼要這樣做?
與您提問的問題並不完全相關,但請考慮使用ThreadPool,而不是每次都啓動一個新線程。線程啓動起來相對昂貴,如果它在一秒鐘內終止,讓線程池重新使用線程會更有效率。 – 2010-12-02 23:01:30
@David Yaw - 感謝您的提示!我會研究這一點。 – Vaccano 2010-12-03 04:35:52