簡體   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