3

我有以下代码:

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

我只能发布方法签名。现在我需要传递一个空值作为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因为这是在您验证所需参数并且它是空引用时抛出的正确异常。NullReferenceException不应由用户代码以编程方式抛出。

在这种情况下,方法只有一个参数,这可以省略,但是如果您想进一步改进您的测试,您可以通过执行以下操作断言异常与相关参数相关联:

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 回答