2017-02-15 17 views
0

これはちょっと変わった設定です。私はテストをMSTest(Visual Studio Unit Tests)からNUnit 3+に移しています。C#でテストに失敗することなくNUnit AssertionExceptionをキャッチ

私の元のテストフレームワークでは、検証と呼ばれるテストユーティリティを追加しましたが、アサーションは行われませんでしたが、例外は抑制/無視されました。

public class Verify { 
    public static int NumExceptions = 0; 

    public static void AreEqual(int expected, int actual) { 
     try { 
      Assert.AreEqual(expected, actual); 
     } catch (AssertFailedException) { 
      NumExceptions++; 
     } 
    } 

    public static void AssertNoFailures() { 
     Assert.AreEqual(0, _numExceptions); 
    } 
} 

ので、このためのテストコードは次のようになります。よりよいがあるよう

[TestMethod] 
public void VerifyPassesCorrectly() { 
    int x = 2; 
    int y = 3; 

    Verify.AreEqual(3, y); 
    Verify.AreEqual(2, x); 
    Verify.AreEqual(5, x + y); 

    Verify.AssertNoFailures(); 
} 

[TestMethod] 
[ExpectedException(typeof(AssertFailedException))] 
public void VerifyCountsFailuresCorrectly() { 
    Verify.AreEqual(3, 2); 
    Assert.AreEqual(1, Verify.NumExceptions); 
} 

これらのテストは、私はNUnitのに移動するとAssertFailedExceptionが

を投げたにもかかわらず、合格両方、それはそうですこの問題を回避する方法(Warn、MultipleAssert)。最終的には、これらの改善を利用するための新しいテストを構築します。しかし、その間に、私は既存のテストに対していくつかの下位互換性を提供する必要があります。

私の当初の計画では、単純にライブラリをスワップアウトし、例外タイプに変更しました:

public static void AreEqual(int expected, int actual) { 
    try { 
     Assert.AreEqual(expected, actual); 
    } catch (AssertionException) { 
     NumExceptions++; 
    } 
} 

をこれは、既存のテストコードに、また実際に確認したクラスの構造への実質的な変更を必要としません。しかし、NUnitアダプタを使用してVisual Studio内からこのようなテストを実行すると、その2番目のテストは期待通りに実行されますが(例外ではありません)、検証ステップで見つかった例外をリストしたテストには失敗します。

もっと広い解決策は、NUnitのおかげで不要になったので、単純にVerifyクラスを削除することです。しかしそれが起こるまで、Verifyクラス内のAssertionsがNUnitによって "格納"されず、テストに失敗するように、Verify内でNUnit APIを使用する方法がありますか?

答えて

2

あなたは、何らかの形でテストが失敗しないように、NUnitに伝えることはできません。だから、できますか?自分でAreEqualメソッドを変更するだけで、自分で同等性テストを行うことができます。

if (expected != actual) { 
    NumExceptions++; 
} 

これは最も簡単な解決策です。

第2の選択肢は、AssertステートメントでNUnitがやっていることを正確に行うことです。もしにしたいのであれば(もちろんテストに失敗することはありません)。コードは次のようになります。

public static void AreEqual(int expected, int actual) { 
    var equalToConstraint = Is.EqualTo(expected); 
    var result = equalToConstraint.ApplyTo(actual); 
    if (!result.IsSuccess) { 
     NumExceptions++; 
    } 
} 

Isクラスは、NUnitのの一部ですが、それは公開され、あなたがしたい場合は、このようにそれを使用することができます。

+0

このプロセスを経ている間、それは私に起こりました。私はそれを行う "より良い"方法があるかもしれないと思っていた。ありがとう! –

関連する問題