繁体   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