单元测试单身人士

时间:2011-05-05 12:31:54

标签: c# .net unit-testing singleton

我有一个包含对统计对象的引用的单例。

当我对使用该单例的程序运行几个单元测试时 - 测试之间的值持续。

我虽然当我在做Program.Main()时,所有这些都是在单元测试之间重新开始的,但不知怎的,它会记住上次测试的结果。

如何编写将彼此隔离的单元测试(我不想要clean()函数 - 我希望它重新开始使用新的“所有内容”),

5 个答案:

答案 0 :(得分:18)

简短版本:不要将单身人士视为单身人士。将它们写为普通类,并通过Inversion of Control容器调用它们,您可以在其中将类配置为单例。

这样,您可以对该类进行单元测试,如果您今天或明天决定该单例不是该类的正确生活方式,只需修改IoC容器的配置即可。

答案 1 :(得分:4)

我在这里写了一篇帖子:http://pvlerick.github.io/2017/03/how-to-get-rid-of-a-singleton

TL; DR:

  1. 从Singleton中提取一个接口(即使你不拥有它),并使你的类对该接口而不是Singleton的实例起作用;
  2. 根据您是否拥有Singleton,您可以使其实现该接口,或者您需要一个简单的适配器。

答案 2 :(得分:1)

查看此Unit testing with singletons

我还建议使用像Moq

这样的模拟框架

隔离你的测试

答案 3 :(得分:1)

当尝试测试单身本身时,以下可能是一个可能的解决方案:

public class Singleton
{
    private static Singleton _Instance;

    public static Singleton getInstance() {
        if (_Instance == null)
        {
            _Instance = new Singleton();
        }

        return _Instance;
    }

    private Singleton()
    {
    }

    public static resetForTesting() {
        _Instance = null
    }
}

因此,在您的单元测试框架中,您可以在每次单元测试之前调用Singleton.resetForTesting()

注意:这种方法的缺点是没有代码级限制会阻止某人在生产代码中调用此方法,即使它只是用于测试代码。因此,您必须依靠文档将其传达给其他人。

答案 4 :(得分:0)

您可以将属性设置器添加到将重新分配单例实例的单例类中。这样在测试中你可以存根/模拟你的单身人士。