web-dev-qa-db-ja.com

NUnit Assert.ThrowsメソッドまたはExpectedException属性を使用しますか?

私は、これらが例外をテストする主な2つの方法のように思われることを発見しました。

Assert.Throws<Exception>(()=>MethodThatThrows());

[ExpectedException(typeof(Exception))]

これらのうちどれが最適でしょうか?一方は他方よりも利点がありますか?それとも、単に個人的な好みの問題ですか?

142
SamuelDavis

1つ目では、複数の呼び出しを使用して、複数の例外をテストできます。

Assert.Throws(()=>MethodThatThrows());
Assert.Throws(()=>Method2ThatThrows());

2番目の方法では、テスト関数ごとに1つの例外のみをテストできます。

86
chue x

主な違いは次のとおりです。

ExpectedException()属性は、テストメソッドのanyプレースで例外が発生した場合にテストをパスします。
Assert.Throws()を使用すると、例外が予想されるコードのexact場所を指定できます。

NUnit 3.0は、ExpectedExceptionの公式サポートを完全に廃止します。

したがって、Assert.Throws()属性よりもExpectedException()メソッドを使用することをお勧めします。

250

例外がスローされた後、他の条件を検証およびアサートできるので、私はassert.throwsを好みます。

    [Test]
    [Category("Slow")]
    public void IsValidLogFileName_nullFileName_ThrowsExcpetion()
    {
        // the exception we expect thrown from the IsValidFileName method
        var ex = Assert.Throws<ArgumentNullException>(() => a.IsValidLogFileName(""));

        // now we can test the exception itself
        Assert.That(ex.Message == "Blah");

    }
35
Mike Parkhill

また、予想されるエラーを強力に入力することもできます(古いattribバージョンのように)。

Assert.Throws<System.InvalidOperationException>(() => breakingAction())
10
Reverend Sfinks

NUnitの古いバージョン(<= 2.0)を使用している場合は、ExpectedExceptionを使用する必要があります。

2.5以降のバージョンを使用している場合、Assert.Throw()を使用できます

https://github.com/nunit/docs/wiki/Breaking-Changes

使用方法: https://www.nunit.org/index.php?p=exceptionAsserts&r=2.5

0
Gireesh k