如何为具有多个状态的Singleton对象运行测试用例?

时间:2013-05-31 08:19:07

标签: c# singleton testcase

我在C#中有一个单例对象。

此单例对象基于分配给它的某个状态而工作。

我没有任何方法可以在运行时切换单例对象的状态。此外,我不需要它,因为应用程序始终在一个状态下启动并保持相同的状态。

问题在于编写测试用例。我已经为每个州编写了测试用例。但是我无法运行它,因为对于所有测试用例我都有一个状态的单个对象。

如何为其他州运行测试。如何为每个测试重新创建对象?

我不想更改测试用例的单例对象代码。

非常感谢任何想法或想法。

3 个答案:

答案 0 :(得分:4)

这就是为什么不自行管理类的生命周期,而是让AutofacUnity等控制反转(IoC)容器为您。然后,您只需创建一个类似于任何其他类的类,并告诉您的IoC容器将其实例化为单例。

另见An Autofac Lifetime Primer

如果您不能使用IoC容器(不能想到任何容器,但让它变得灵活),您可以创建一个包含“singleton”逻辑的internal类 - 这个内部类只是一个内部类,而不是单例......

internal class MyLogic
{
   ...
}

然后将它包装在一个公共类中,并使其成为一个单例。如果将这两个类放在一个Project中,那么应用程序无法访问内部类(业务逻辑的实现),只能访问公共单例版本。

public sealed class MySingleton 
{
    private MySingleton() { Implementation = new MyLogic(); }

    public static MySingleton Instance { ... }

    private MyLogic Implementation { get; set; }

    ...
}

但是,您可以在AssemblyInfo中指出您的单元测试项目可以使用

访问内部类
[assembly: InternalsVisibleTo("MySolution.UnitTests")]

这样,您可以对您的逻辑类进行单元测试,而您的应用程序只能将其用作单例。

坦率地说,我更喜欢IoC方式,但如果这对你来说是新的,那么实现上述解决方案可能会更快。

祝你好运!

答案 1 :(得分:1)

  

我不想更改测试用例的单例对象代码。

也许是时候考虑为整个计划改变它了。你需要这是单身的原因吗? Singleton是一个伟大的模式如果你需要它,但它经常被想要使用全局变量但听说它们是邪恶的人滥用。现在他们编写单身人士,因为他们的工作方式相同,同时也是酷炫OOP的“模式”之一。

但单身人士只不过是全球性的。它具有与全球相同的问题。如果您使用该模式,请确保您实际上需要它,因为它附带了问题,您需要权衡利弊。如果你不使用这些好处,你只有缺点。

答案 2 :(得分:0)

我建议你尽可能避免单身人士,请参阅Misko Hevery的演讲:The Clean Code Talks