unit testing单身人士

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

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

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

如何编写将彼此隔离的unit testing(我不想要clean()函数 – 我希望它重新开始使用新的“一切”),

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

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

我在这里写了一篇关于它的post: http : //pvlerick.github.io/2017/03/how-to-get-rid-of-a-singleton

TL; DR:

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

(上面的答案如下)

嗯,这似乎是合乎逻辑的,因为你的单身人士可能处于AppDomain级别。 因此,只要您在同一个AppDomain中,就只有一个用于所有测试。

我不知道测试框架是如何处理的,但是如果你想自己做这个,你将不得不为你的每个测试创建一个单独的AppDomain,但我被告知这将是非常困难的: http:// msdn .microsoft.com / EN-US /库/ 6s0z09xw.aspx

用单身人士看这个unit testing

我也想重新使用像Moq这样的模拟框架

隔离你的考试

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

 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 } } 

因此,在unit testing框架中,您将在每个unit testing之前调用Singleton.resetForTesting()

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

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