web-dev-qa-db-ja.com

NUnitの予期される例外

テストケースのセットがありますが、その一部は例外をスローすることが予想されます。このため、これらのテストの属性を設定して、次のような例外を予期しています。

[ExpectedException("System.NullReferenceException")]

テストをローカルで実行すると、すべてがうまくいきます。ただし、TeamCityを実行しているCIサーバーにテストを移動すると、例外が予想されるすべてのテストが失敗します。これは既知のバグです。

NUnitが提供するAssert.Throws<>およびAssert.Throwsメソッドもあることを認識しています。

私の質問は、現在使用している属性の代わりにこれらをどのように使用できますか?

私はStackOverflowを見て回って、私には役に立たないと思われるいくつかのことを試しました。

これを使用する簡単な1行のソリューションはありますか?

50
Martin

あなたがそれを試して何があなたに問題を与えているのかはわかりませんが、Assert.Throwsの最初の引数としてラムダを渡すだけです。合格したテストの1つを次に示します。

_Assert.Throws<ArgumentException>(() => pointStore.Store(new[] { firstPoint }));
_

さて、その例は少し冗長だったかもしれません。私がテストを受けたとします

_[Test]
[ExpectedException("System.NullReferenceException")]
public void TestFoo()
{
    MyObject o = null;
    o.Foo();
}
_

o.Foo()はnull参照例外を発生させるため、これは正常に渡されます。

次に、ExpectedException属性を削除し、o.Foo()への呼び出しを_Assert.Throws_でラップします。

_[Test]
public void TestFoo()
{
    MyObject o = null;
    Assert.Throws<NullReferenceException>(() => o.Foo());
}
_

_Assert.Throws_ "特定の例外をスローすることを確認するために、デリゲートとして表されるコードスニペットを呼び出そうとします。" _() => DoSomething()_構文は、lambda、本質的には匿名メソッドを表します。したがって、この場合、スニペットo.Foo()を実行するように_Assert.Throws_に指示しています。

いいえ、属性を実行するように1行追加するだけではありません。 _Assert.Throws_の呼び出しで、例外をスローするテストのセクションを明示的にラップする必要があります。ラムダを使用する必要はありませんが、それが最も便利な場合がよくあります。

89
Mark Rushakoff

両方の方法を使用した簡単な例を示します。

string test = null;
Assert.Throws( typeof( NullReferenceException ), () => test.Substring( 0, 4 ) );
Assert.Throws<NullReferenceException>( () => test.Substring( 0, 4 ) );

ラムダを使用したくない場合。

[Test]
public void Test()
{
    Assert.Throws<NullReferenceException>( _TestBody );
}

private void _TestBody()
{
    string test = null;
    test.Substring( 0, 4 );
}
10

デフォルトでは、TeamCityはNUnit 2.2.10を使用しますが、これにはExpectedExceptionはありません。 TeamCityの「NUnit for NAnt」ドキュメントを参照して、TeamCityが提供する特定のリリースのリストなど、それをより現代的なものに変更する方法を確認してください。

2
Ross Patterson

NUnitは新しいRecord.Exceptionメソッドを追加しました。

ActsとAssertsを分離する場合は、

行為:

ex = Record.Exception(()={throw new Exceprtion()} 

主張する:

Assert.NotNull(ex);
0
David