我在C#中有一个单例对象。
此单例对象基于分配给它的某个状态而工作。
我没有任何方法可以在运行时切换单例对象的状态。此外,我不需要它,因为应用程序始终在一个状态下启动并保持相同的状态。
问题在于编写测试用例。我已经为每个州编写了测试用例。但是我无法运行它,因为对于所有测试用例我都有一个状态的单个对象。
如何为其他州运行测试。如何为每个测试重新创建对象?
我不想更改测试用例的单例对象代码。
非常感谢任何想法或想法。
答案 0 :(得分:4)
这就是为什么不自行管理类的生命周期,而是让Autofac或Unity等控制反转(IoC)容器为您。然后,您只需创建一个类似于任何其他类的类,并告诉您的IoC容器将其实例化为单例。
如果您不能使用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