单元测试 - 如何测试此类

时间:2015-06-04 15:31:51

标签: c# unit-testing

我创建了class Cache(包裹System.Runtime.Caching.MemoryCache),其中包含以下公共方法:

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

如何在不使用Contains()方法的情况下测试Add()方法,以便将项目添加到缓存中???当然,如果我在Add()方法的单元测试中使用Contains()方法,这将是错误的吗?

2 个答案:

答案 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));
    }