首页 > 解决方案 > 没有依赖关系的类的单元测试

问题描述

想象一下我有以下课程:

public class MyWeirdCollection
{
    private IList<string> _myTrueList;
    private IList<string> _myFalseList;

    public MyCollection()
    {
        _myTrueList = new List<string>();
        _myFalseList = new List<string>();
    }

    public void Add(string item, bool listType)
    {
        if (listType)
        {
            _myTrueList.Add(item);
        }
        else
        {
            _myFalseList.Add(item);
        }
    }

    public IList<string> Get(bool listType)
    {
        return listType ? _myTrueList : myFalseList;
    }
}

我将如何对GetAdd方法进行单元测试?我怀疑两种可能的解决方案:

  1. 使 2 个列表受保护而不是私有,因此我可以创建一个继承TestableWeirdCollectionClass,将列表的内容公开给测试
  2. 让课堂保持原样AddGet一起测试吗?即调用Add添加一些元素,然后Get查看是否返回正确的值。

我倾向于选择没有。2,但想多提点意见。谢谢。

标签: c#unit-testing

解决方案


绝对选择选项 2。我能想象到的几乎所有测试都必须一起Add进行Get

在测试时,您最终是在测试公共接口,而不是内部状态。测试代码的整个想法是你给它项目,然后你用适当的密钥把它们拿回来。在您的特定情况下,它使用私有列表来保存项目,但情况可能并非如此(您可能将它们存储到数据库或文件中,依赖于另一个类或其他东西)。这最终是一个实现细节,重要的是它Add总是Get一起玩,因此你应该这样做。


推荐阅读