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