繁体   English   中英

单元测试具有接口类型参数的方法

[英]Unit testing a method having parameter of interface type

我有以下代码:

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"));

    }
}

提供了

老式

Pre 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
    }
}

使用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
}

尝试:

[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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM