.NET プラットフォームで Xunit と NMock を使用しています。メソッドが非同期のプレゼンテーション モデルをテストしています。メソッドは非同期タスクを作成して実行するため、メソッドはすぐに戻り、確認する必要がある状態はまだ準備ができていません。
SUT を変更せずに終了時にフラグを設定することはできますが、それは、おそらくタイムアウトを使用して、たとえば while ループでフラグをチェックし続ける必要があることを意味します。
私のオプションは何ですか?
.NET プラットフォームで Xunit と NMock を使用しています。メソッドが非同期のプレゼンテーション モデルをテストしています。メソッドは非同期タスクを作成して実行するため、メソッドはすぐに戻り、確認する必要がある状態はまだ準備ができていません。
SUT を変更せずに終了時にフラグを設定することはできますが、それは、おそらくタイムアウトを使用して、たとえば while ループでフラグをチェックし続ける必要があることを意味します。
私のオプションは何ですか?
#1の答えは、実際にはこの問題を解決するために古いパターンを推奨しているため、これに関する更新が必要かもしれないと思っただけです.
.net 4.5 + xUnit 1.9 以降では、単純に Task を返し、オプションでテストから async キーワードを使用して、テストが非同期的に完了するまで xunit を待機させることができます。
xUnit.net 1.9に関するこの記事を参照してください。
[Fact]
public async Task MyAsyncUnitTest()
{
// ... setup code here ...
var result = await CallMyAsyncApi(...);
// ... assertions here ...
}
あなたのオブジェクトは、イベントなど、非同期メソッドが終了したことを示す何らかのシグナルを備えていますか? その場合は、次のアプローチを使用できます。
[Test]
public void CanTestAsync()
{
MyObject instance = new MyObject()
AutoResetEvent waitHandle = new AutoResetEvent(false);
// create and attach event handler for the "Finished" event
EventHandler eventHandler = delegate(object sender, EventArgs e)
{
waitHandle.Set(); // signal that the finished event was raised
}
instance.AsyncMethodFinished += eventHandler;
// call the async method
instance.CallAsyncMethod();
// Wait until the event handler is invoked
if (!waitHandle.WaitOne(5000, false))
{
Assert.Fail("Test timed out.");
}
instance.AsyncMethodFinished -= eventHandler;
Assert.AreEqual("expected", instance.ValueToCheck);
}
私の好みの方法は、テスト中に非同期にならないように、実際のスレッド化メカニズムをモックアウトして注入することです。それが不可能な場合もあります (メソッドのスレッド化がフレームワークの一部である場合、または制御できない場合)。
スレッドの作成を制御できない場合は、スレッドが何らかの方法で終了するのを待機します。while ループまたはスレッドがかかるはずの時間を指定して待機し、状態がそこにない場合はテストに失敗します。とにかく時間がかかりすぎた。
Silverlight アプリケーションの単体テストに関する私の記事をチェックしてください
http://www.codeproject.com/KB/silverlight/Ag3DemoLOB.aspx
WCF サービスを非同期的に呼び出すメソッドの単体テストの例があります...