2011-06-21 7 views
3

マルチスレッドコンテキストではnunitを使用できますか。 もちろん、nunitでマルチスレッドアプリケーションをテストするのではなく、nunitアサーションを使用したい場合はNUnitは別のスレッドでアサートします

簡単な例 - このテストは "グリーン"です。何が悪いですか?

[Test] 
public void Test() 
{ 
    Action action = Async; 
    action.BeginInvoke(action.EndInvoke, null).AsyncWaitHandle.WaitOne(); 
} 

private void Async() 
{ 
    Assert.IsTrue(false); 
    Assert.DoesNotThrow(() => 
         { 
         Console.WriteLine("Async"); 
         throw new InvalidOperationException(); 
         }); 
} 

答えて

6

NUnitテストランナー実行可能ファイルは、非テストスレッドの例外を無視するように構成されています。あなたはapp.configを構成要素を介して、この動作を設定することができます。

legacyUnhandledExceptionPolicy

あなたが処理されない例外を引き起こすために非テストスレッドを設定することができ、そのためのテストはその後、失敗します。注意点は、別のテストが実行されている間に非テストスレッドの例外が発生する可能性がありますので、の正確な画像が得られない可能性があります。テストに失敗しました。また、これは処理されない例外であるため、例外が発生した時点でテスト実行が停止し、通常の動作ではなく継続されます。

私の意見では無視した方が良いです。

次の資料は、ReSharperのテストランナーのためのトピックに関するいくつかの詳細になりますが、原則は同じです。

ReSharper test runner – hidden thread exceptions

ビューのアサーションの観点から、マルチスレッドの側面を持っている場合は、私はそれがより良い仕上がりに非テストスレッドを待ち、非テストスレッド上などのフラグを設定するために見つけ、テストスレッド上に状態をアサートします。このようにして、主スレッドでアサーション例外が発生し、テストが期待通りに実行されます。

不自然な例

[Test] 
    public void Test() 
    { 
     Exception ex = null; 

     Action test =() => 
     { 
      Console.WriteLine("Async"); 

      ex = new InvalidOperationException(); 
     }; 

     test.BeginInvoke(test.EndInvoke, null).AsyncWaitHandle.WaitOne(); 

     Assert.That(ex, Is.Null, "Exception did not happen."); 
    } 
0
Assert.IsTrue(false); 

DoesNotThrow呼び出しの前に例外がスローされます。しかし、NUnitは複数のスレッドで動作しません。クロススレッドは、UnitTestよりも多くの統合です。一般的に私は、外部からスレッド/タスクを公開し、使用されたオブジェクトの内部の振る舞いを避けることを推奨します。そのため、テストの目的でこの振る舞いを模擬することができます。

関連する問題