3

次のコードがあります。

public BooksInfo GetBookInfo(IBookMarket bookinfo)
{
    // Implementation omitted
}

メソッドの署名のみを投稿できます。ここで、null 値を渡して、bookinfo例外が発生するかどうかをテストする必要があります。

NUnitを使用してこの単体テストを行う方法を簡単に説明できますか?

質問を編集:

私のユニットテストコード

[TestFixture]

public class FutureTests
{
    //[Test]
    //[ExpectedException(typeof(NullReferenceException),
    // ExpectedMessage = "No value provided!")]
    public void GetPriceData_PassNull_ThrowsException()
    {
        Assert.That(
                () => library.GetPriceData(null),
                Throws.InstanceOf<ArgumentNullException>()
                .With.Property("").EqualTo("pricer"));

    }
}
4

3 に答える 3

4

によって提供されるいくつかの可能性があります。

古いスタイル

2.X より前の実装

[TestFixture]
public class TestGetBookInfo
{
    [Test]
    [ExpectedException(
        ExpectedException = typeof(YourException),
        ExpectedMessage = "Your detailed message",
        MatchType = MessageMatch.Contains)]
    public void TestGetBookInfoException()
    {
        new BookInfoProvider().GetBookInfo(null);
    }
}

新しいスタイル

現在の流暢な実装

[TestFixture]
public class TestGetBookInfo
{
    [Test]
    public void TestGetBookInfo()
    {
        Assert.That(
            () => new BookInfoProvider().GetBookInfo(null),
                Throws.InstanceOf<YourException>()
                    .And.Message.Contains("Your detailed message"));
    }
}

データ駆動型

ケースを組み合わせることができるデータ駆動型の実装

[TestFixture]
public class TestGetBookInfo
{
    object[] TestData =
    {
        new TestCaseData(new BookMarketStub()), // "good" case
        new TestCaseData(null).Throws(typeof(YourException)) // "bad" exceptional case
    };

    [Test]
    [TestCaseSource("TestData")]
    public void TestGetBookInfo(IBookMarket bookinfo)
    {
        new BookInfoProvider().GetBookInfo(bookinfo);
        Assert.Pass("all ok"); // this is not necessary
    }
}
于 2012-08-17T11:41:27.033 に答える
3

NUnitを使用すると、次のようになります。

Assert.That(
    () => library.GetBookInfo(null),
    Throws.InstanceOf<ArgumentNullException>());

libraryこのコードは、がメソッドを定義したタイプのインスタンスであることを前提としていますGetBookInfoまた、このアプローチは、テスト自体ではなく、例外をスローしているのは実際にはテスト対象のコードであると主張するため、代替案よりもかなりの利点がありExpectedExceptionます。

ArgumentNullException必須パラメーターを検証するときにスローする正しい例外であり、null参照であるため、メソッドがスローすることを確認します。はNullReferenceException、ユーザーコードによってプログラムでスローされるべきではありません。

メソッドにパラメータが1つしかないこの場合、これは省略できますが、テストをさらに改善したい場合は、次のようにして、例外が問題のパラメータに関連付けられていると断言できます。

Assert.That(
    () => library.GetBookInfo(null),
    Throws.InstanceOf<ArgumentNullException>()
        .With.Property("ParamName").EqualTo("bookinfo"));

この追加のアサーションを使用すると、テストでコードが次のように実装されることが保証されます(必要に応じて)。

public BooksInfo GetBookInfo(IBookMarket bookinfo)
{
    if (bookinfo == null) throw new ArgumentNullException("bookinfo");

    // Implementation omitted
}
于 2012-08-17T11:36:40.277 に答える
1

試す:

[Test]
public void myTest
{
    try
    {
       // Hier you call your methode GetBookInfo(null)
       Assert.True(false);
    }
    Catch (NullReferenceException e)
    {
        Assert.True(true);
    }    
} 

または、次のように ExpectedException 属性をテストに設定することもできます。

[Test ExpectedException( typeof( NullReferenceException) )]
public void myTest
{
    //Just Call the Methode which should throw an exception
}
于 2012-08-17T11:31:30.267 に答える