[英]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.