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