簡體   English   中英

單元測試-我如何測試該課程

[英]Unit Testing - How do I test this class

我已經創建了具有以下公共方法的class Cache (包裝System.Runtime.Caching.MemoryCache ):

bool Add(string key, object value)
bool Contains(string key)

我如何測試Contains()方法而不首先使用Add()方法向緩存中添加項目? 當然,如果我在單元測試中對Contains()方法使用Add()方法,那會錯嗎?

如何在不首先使用Add()方法將項目添加到緩存的情況下測試Contains()方法?

斷言它返回false。

當然,如果我在單元測試中對Contains()方法使用Add()方法,那會錯嗎?

當然不是。 您正在測試一個具有一個Contains()的單元,該單元在調用Add()之后具有不同的行為。 Add()之后沒有對Contains()進行測試將是錯誤的。

我想我理解你的困境。 您在詢問是否使用一種新方法來測試另一種新方法。 用未知數測試未知數。

對我來說,我將其視為假設的測試隔離情況。 讓我解釋...

如果同時存在兩種方法,並且您有責任對其進行測試,則以下內容適用。

在第一個實例中,您想測試Add(,)方法。 在這種情況下,我將“假設”所有其他方法均正常工作。 因此,在那種情況下,我將運行一個Add(key,value)並檢查它是否聲明為true,然后通過調用Contains(key)進行驗證並確保它聲明為true。 即使Contains()未經測試。

然后,在第二個實例中,假定Add(,)正常工作並測試Contains()方法。 我總是基於以下假設進行測試:我已經眨了眨眼,並測試了特定的東西,特定的方法,特定的類,並在運行測試所需的所有支持均能正常工作的假設下運行。

實際上,情況並非總是如此,某些支持方法無法按預期工作。 但是,測試會讓您知道。 這就是它的用途。 幫助揭示這些問題。

您可能已經在考慮此測試,但是,這里有一個簡單的示例,您可以將這兩種方法的測試合並為一個測試。 當然,您可以將其分為兩個測試(一個以Add()為中心,另一個以Contains()為中心),但是它們看起來非常相似。 希望對您有所幫助。

public class SomeClass : MemoryCache
{
    public SomeClass() : base("Test")
    {
    }

    public bool Add(string key, object value)
    {
        return Add(key, value, DateTime.Now.AddDays(1));
    }
}

[TestFixture]
public class TestSomeClass
{
    [Test]
    public void TestSomeClassMethod1()
    {
        var instance = new SomeClass();

        const string key = "someKey";
        Assert.IsFalse(instance.Contains(key));

        Assert.IsTrue(instance.Add(key, new object()));
        Assert.IsTrue(instance.Contains(key));

        instance.Remove(key);
        Assert.IsFalse(instance.Contains(key));
    }
}

但是,使用純TDD方法,您可以這樣做:

創建Add(,)方法,然后編寫以下測試:

   [Test]        
    public void TestAdd()
    {
        var instance = new SomeClass();

        const string key = "someKey";
        Assert.IsTrue(instance.Add(key, new object()));
    }

然后,您將創建Contains()方法,然后編寫以下測試:

    [Test]
    public void TestContains()
    {
        var instance = new SomeClass();

        const string key = "someKey";
        Assert.IsFalse(instance.Contains(key));

        // A purest will say that you don't need the following Assert
        // for the Add as it is not what you are testing. 
        // But I don't see any harm
        Assert.IsTrue(instance.Add(key, new object()));
        Assert.IsTrue(instance.Contains(key));

        instance.Remove(key);
        Assert.IsFalse(instance.Contains(key));
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM