23

.NET プラットフォームで Xunit と NMock を使用しています。メソッドが非同期のプレゼンテーション モデルをテストしています。メソッドは非同期タスクを作成して実行するため、メソッドはすぐに戻り、確認する必要がある状態はまだ準備ができていません。

SUT を変更せずに終了時にフラグを設定することはできますが、それは、おそらくタイムアウトを使用して、たとえば while ループでフラグをチェックし続ける必要があることを意味します。

私のオプションは何ですか?

4

4 に答える 4

48

#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 ...
}
于 2012-05-10T20:28:17.643 に答える
20

あなたのオブジェクトは、イベントなど、非同期メソッドが終了したことを示す何らかのシグナルを備えていますか? その場合は、次のアプローチを使用できます。

[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);
}
于 2009-07-23T21:57:21.383 に答える
4

私の好みの方法は、テスト中に非同期にならないように、実際のスレッド化メカニズムをモックアウトして注入することです。それが不可能な場合もあります (メソッドのスレッド化がフレームワークの一部である場合、または制御できない場合)。

スレッドの作成を制御できない場合は、スレッドが何らかの方法で終了するのを待機します。while ループまたはスレッドがかかるはずの時間を指定して待機し、状態がそこにない場合はテストに失敗します。とにかく時間がかかりすぎた。

于 2009-07-23T21:55:31.043 に答える
2

Silverlight アプリケーションの単体テストに関する私の記事をチェックしてください

http://www.codeproject.com/KB/silverlight/Ag3DemoLOB.aspx

WCF サービスを非同期的に呼び出すメソッドの単体テストの例があります...

于 2009-07-24T13:26:03.147 に答える