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