我有這個類我想單元測試:等到單元測試的所有任務完成
public class SomeClass
{
public void Foo()
{
Bar();
}
private void Bar()
{
Task.Factory.StartNew(() =>
{
// Do something that takes some time (e.g. an HTTP request)
});
}
}
這是我的單元測試看起來像:
[TestMethod]
public void TestFoo()
{
// Arrange
var obj = new SomeClass();
// Act
obj.Foo();
obj.Foo();
obj.Foo();
// Assert
/* I need something to wait on all tasks to finish */
Assert.IsTrue(...);
}
所以,我需要讓單元測試線程等待,直到開始斷言之前,在Bar
方法中開始的所有任務都完成了他們的工作。
重要:我不能改變SomeClass
我怎麼能這樣做?
不幸的是,你的設計是壞的。你不應該在不返回任何東西給調用者等待的情況下產生新的任務。這是特別有問題的,因爲託管線程池的線程(執行任務的線程)被標記爲後臺線程,這意味着如果應用程序的前臺線程終止,您的任務可能會在完成之前中止。 – Douglas
我知道,但不幸的是我無法改變它,上面的示例只是簡化了我面臨的複雜情況。 – mmutilva