web-dev-qa-db-ja.com

NUnit 3の[TestCase]属性を使用した例外のテスト?

NUnit3を使用してTestCaseで例外をテストするにはどうすればよいですか?

次のように定義されたメソッドDivide(a,b)があるとします:

_public double Divide(double a, double b)
{
    if(Math.Abs(b) < double.Epsilon) throw new ArgumentException("Divider cannot be 0");
    return a/b;
}
_

NUnit 3.0テストケースを使用してこのメ​​ソッドをテストしたいので、次のようにします。

_[TestCase(-10, 2, -5)]
[TestCase(-1, 2, -0.5)]
public void TestDivide(double a, double b, double result)
{
    Assert.That(_uut.Divide(a, b), Is.EqualTo(result));
}
_

Divide()にArgumentExceptionをスローさせるテストケースを指定する方法はありますか?線に沿って何か:

_[TestCase(-10, 2, -5)]
[TestCase(-1, 2, -0.5)]
[TestCase(-1, 0, ExpectedResult = TypeOf(ArgumentException)]
public void TestDivide(double a, double b, double result)
{
    Assert.That(_uut.Divide(a, b), Is.EqualTo(result));
}
_

(もちろん、別のテストメソッドを定義し、これでAssert.Throws()を使用できます。したがって、これは純粋に好奇心から外れています)

29
Corpus Gigantus

ExpectedExceptionはNUnit 2.Xの正しいメソッドでしたが、NUnit 3から削除されました。

NUnit Google Group および同等のDevグループにはさまざまな議論のスニペットがありますが、一般に、予想される結果と例外を個別の方法でテストするのに適した設計パターンであるという決定が下されたようです。 ( リンク

NUnit 3でこれを行う唯一の方法は、2つの個別のテストに分割することです。 (NUnitコアチームによって回答された同様の質問で確認されました here 。)

[TestCase(-10, 2, -5)]
[TestCase(-1, 2, -0.5)]
public void TestDivide(double a, double b, double result)
{
    Assert.That(_uut.Divide(a, b), Is.EqualTo(result));
}

[TestCase(-1, 0)]
public void TestDivideThrows(double a, double b)
{
    Assert.That(() => _uut.Divide(a, b), Throws.TypeOf<ArgumentException>());
}
32
Chris