1

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

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

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

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

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

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

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

4

3 回答 3

4

这就是为什么不用自己管理类的生命周期而是让诸如AutofacUnity之类的控制反转 (IoC) 容器为您做这件事很方便的原因之一。然后,您只需创建一个看起来像任何其他类的类,并告诉您的 IoC 容器将其实例化为单例。

另见Autofac Lifetime Primer

在你不能使用 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")]

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

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

祝你好运!

于 2013-05-31T08:21:54.517 回答
1

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

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

但是单例只是一个全局的。它和全球有同样的问题。如果您使用该模式,请确保您确实需要它,因为它附带问题,您需要权衡利弊。如果你不使用好处,你只有缺点。

于 2013-05-31T08:28:49.853 回答
0

我建议您尽可能避免使用单例,请参阅 Misko Hevery 的演讲:The Clean Code Talks

于 2013-05-31T08:25:15.473 回答