繁体   English   中英

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

[英]How to run test cases for Singleton object with multiple state?

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

该单例对象根据分配给它的某些状态工作。

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

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

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

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

任何想法或想法将不胜感激。

这就是为什么不方便自己管理类的生存期,而是让诸如AutofacUnity这样的控制反转(IoC)容器为您做到这一点的原因之一。 然后,您只需创建一个类似于其他任何类的类,并告诉您的IoC容器将其作为单例实例化。

另请参见Autofac生命周期入门

在无法使用IoC容器的情况下(想不出什么,但是要灵活一点),您可以创建一个包含“单例”逻辑的internal类,而这个内部类就是这样,内部类,不是单身...

internal class MyLogic
{
   ...
}

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

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

    public static MySingleton Instance { ... }

    private MyLogic Implementation { get; set; }

    ...
}

但是,然后您可以在AssemblyInfo指出,通过使用以下命令,您的单元测试项目确实可以访问内部类

[assembly: InternalsVisibleTo("MySolution.UnitTests")]

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

坦率地说,我更喜欢使用IoC方式,但是如果您不熟悉IoC方式,则可以更快地实施上述解决方案。

祝好运!

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

也许是时候考虑为整个程序进行更改了。 是否有你需要这是单身的一个原因? 如果您需要 ,Singleton是一个很好的模式,但是它经常被想要使用全局变量但听说过它们是邪恶的人滥用。 现在,他们对单例进行编程,因为它们是很酷的OOP的“模式”之一,它们的工作原理相同。

但是单身人士不过是一个整体。 它具有与全球相同的问题。 如果使用该模式,请确保确实需要它,因为它附带有问题,因此需要权衡利弊。 如果您不使用收益,那么您只会有弊端。

我建议您在可能的情况下避免单例,请参阅Misko Hevery的演讲: Clean Code Talks

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM