我创建了class Cache
(包裹System.Runtime.Caching.MemoryCache
),其中包含以下公共方法:
bool Add(string key, object value)
bool Contains(string key)
如何在不使用Contains()
方法的情况下测试Add()
方法,以便将项目添加到缓存中???当然,如果我在Add()
方法的单元测试中使用Contains()
方法,这将是错误的吗?
答案 0 :(得分:3)
如何在不使用Add()方法的情况下测试Contains()方法,以便将项目添加到缓存中?
断言它返回false。
当然,如果我在Contains()方法的单元测试中使用Add()方法,这将是错误的吗?
当然不是。在您调用Contains()
后,您正在测试一个Add()
行为不同的单位。 <{1}}之后调用Contains()
的测试是错误的。
答案 1 :(得分:0)
我想我理解你的困境。您问是否使用新方法测试另一种新方法。用未知的方法测试一个未知的。
对我来说,我会将其视为假设的测试隔离案例。让我解释一下......
如果两种方法都存在且您负责测试它们,则以下情况适用。
在第一个实例中,您要测试Add(,)方法。在这种情况下,我会“假设”所有其他方法都能正常工作。因此,在这种情况下,我将运行Add(键,值)并检查它是否为Asserts,然后通过调用Contains(key)进行验证并确保它Asserts为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));
}