テストケースのセットがありますが、その一部は例外をスローすることが予想されます。このため、これらのテストの属性を設定して、次のような例外を予期しています。
[ExpectedException("System.NullReferenceException")]
テストをローカルで実行すると、すべてがうまくいきます。ただし、TeamCityを実行しているCIサーバーにテストを移動すると、例外が予想されるすべてのテストが失敗します。これは既知のバグです。
NUnitが提供するAssert.Throws<>
およびAssert.Throws
メソッドもあることを認識しています。
私の質問は、現在使用している属性の代わりにこれらをどのように使用できますか?
私はStackOverflowを見て回って、私には役に立たないと思われるいくつかのことを試しました。
これを使用する簡単な1行のソリューションはありますか?
あなたがそれを試して何があなたに問題を与えているのかはわかりませんが、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
_の呼び出しで、例外をスローするテストのセクションを明示的にラップする必要があります。ラムダを使用する必要はありませんが、それが最も便利な場合がよくあります。
両方の方法を使用した簡単な例を示します。
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 );
}
デフォルトでは、TeamCityはNUnit 2.2.10を使用しますが、これにはExpectedExceptionはありません。 TeamCityの「NUnit for NAnt」ドキュメントを参照して、TeamCityが提供する特定のリリースのリストなど、それをより現代的なものに変更する方法を確認してください。
NUnitは新しいRecord.Exceptionメソッドを追加しました。
ActsとAssertsを分離する場合は、
行為:
ex = Record.Exception(()={throw new Exceprtion()}
主張する:
Assert.NotNull(ex);