2

次の方法を検討してください

public void Foo(string str)
{
    if (str == null)
        throw new ArgumentNullException("str");

    if (str.Length != 5)
        throw new MyException();
}

次のようにネガティブ テストを書きたいとします。

public void TestFoo()
{
    try
    {
        Foo(null); //this could be an remote call (e.g. WCF)
        Assert.Fail("Expected ArgumentNullException");
    }
    catch (ArgumentNullException) {} //should this be "Exception" instead?

    try
    {
        Foo("four"); //this could be an remote call (e.g. WCF)
        Assert.Fail("Expected MyException");
    }
    catch (MyException) {} //should this be "Exception" instead?
}

上記のように特定の例外をキャッチすることは実装の詳細であるように思われます。これにより、テストが脆弱になり、(インターフェイスではなく) 実装と結合しすぎる可能性があります。明らかにMyException、いつか変更ArgumentNullExceptionされる可能性がありますが、たとえば、他の例外にラップされる可能性もあります (たとえば、将来の WCF の動作によって)。通常、テストは「4」が失敗する必要があることを認識しており、それが気にするのは失敗だけです。

UserNameTakenExceptionこれに対する例外 (しゃれは意図されていません) は、ユーザーフレンドリーなメッセージ (たとえば、既に使用されているユーザー名にマップされている、別の名前を試してください)など、ユーザーに渡されるものに例外が変換される場合です。. このような場合、正しいエラーが伝えられるようにする必要があります。それでも、可能性のあるユーザー エラーごとに異なる種類の例外を意味するため、少し問題がありますが、それほど悪くはありません (通常、それらの多くはありません)。

私の考え方は理にかなっていますか?Exceptionユーザー向けの例外を含まないテストケースでジェネリックを実際にキャッチする必要がありますか?

4

2 に答える 2

3

少なくとも 4 つのテストを書くだけです。

[Test]
[ExpectedException(typeof(ArgumentNullException))]
public void TestFooForNull()
{
    Foo(null);
}


[Test]
[ExpectedException(typeof(MyException))]
public void TestFooForInvalidSizeTooShort()
{
    Foo("1234");
}


[Test]
[ExpectedException(typeof(MyException))]
public void TestFooForInvalidSizeTooLong()
{
    Foo("123456");
}


[Test]
public void TestFoo()
{
    Foo("12345");
}

単体テストを作成するときは、テストごとに 1 つの特定のケースを扱うのが最善です。

于 2013-08-26T13:17:44.733 に答える
0
  > should I expect the exact exception?
  > ...
  > Should I indeed catch the generic Exception in test cases that 
  > don't involve user-facing exceptions ?

Exceptiondotnet では、AssertionException もキャッチするため、ジェネリックをキャッチすることはお勧めできません。Javaでも同じだと思います

public void ThisTestWillNeverFail()
{
    try
    {
        Assert.Fail("some error message");
    }
    catch (Exception) 
    {
    } 
}
于 2013-08-26T15:09:55.940 に答える