3

パラメータが null の場合は常に ArgumentNullExceptions と ArgumentExceptions をスローすることで、不正な入力から保護されている複数のパラメータを持つメソッドがあります。

したがって、これをテストするには 2 つの明白な方法があります。

  • [ExpectedException] 属性を使用して、パラメーターごとに 1 つのテスト
  • 複数の try{} catch ブロックを使用して、すべてのパラメーターに対して 1 つのテストを行う

try catch は次のようになります。

try 
{
    controller.Foo(null, new SecondParameter());
    Assert.Fail("ArgumentNullException wasn't thrown");
} catch (ArgumentNullException)
{}

ちょっとした問題で。テストに合格した場合、Assert.Fail は呼び出されないため、カバーされていないテスト コードとして (NCover によって) 強調表示されます。

テスト コードではなく、100% カバーしたいビジネス コードであるため、これは実際には問題ではないことはわかっています。複数の Exception スロー呼び出しをデッド LoC なしで 1 つのテストケースに圧縮する方法があるかどうか、まだ興味がありますか?

4

2 に答える 2

7

まあ、ユーティリティメソッドを抽出することで、それを単一のデッドラインに減らすことができます。

public void ExpectException<T>(Action action) where T : Exception
{
    try
    {
        action();
        Assert.Fail("Expected exception");
    }
    catch (T)
    {
        // Expected
    }
}

次のように呼び出します。

ExpectException<ArgumentNullException>
    (() => controller.Foo(null, new SecondParameter());

(もちろん、IDE でラップする必要はありません... SO の行の長さはかなり短いです。)

于 2008-12-22T11:30:12.923 に答える
6

NUnit 2.4.7 のリリース ノートから、NUnit には拡張アセンブリに Andreas Schlapsi によって記述された RowTest 拡張が含まれるようになりました。この拡張により、RowAttribute を使用して、引数を取るテスト メソッドを記述し、引数値の複数のセットを提供できます。RowTest を使用するには、テストで nunit.framework.extensions アセンブリを参照する必要があります。

MbUnit の RowTest 機能を NUnit に追加します。

次のようなものを書くことができます:

[RowTest]
[Row(1, 2, 3)]
[Row(3, 4, 8, TestName="Special case")]
[Row(10, 10, 0, TestName="ExceptionTest1"
    , ExpectedException=typeof(ArgumentException)
    , ExceptionMessage="x and y may not be equal.")]
[Row(1, 1, 0, TestName="ExceptionTest2"
    , ExpectedException=typeof(ArgumentException)
    , ExceptionMessage="x and y may not be equal.")]
public void AddTest(int x, int y, int expectedSum)
{
  int sum = Sum(x, y);
  Assert.AreEqual(expectedSum, sum);
}

http://www.andreas-schlapsi.com/2008/03/31/nunit-247-includes-rowtest-extension/コードはGoogle コード の Nunit RowTestExtension のソース コードからのものです

于 2008-12-23T08:11:10.187 に答える