C#Factory模式,带抽象和内部构造函数,在单元测试下

时间:2014-04-25 10:13:01

标签: c# unit-testing abstract-class factory-pattern internal

在我看来是Microsoft.ServiceBus QueueClient

所以QueueClient是抽象类,带有内部构造函数;我们调用QueueClient.CreateFromConnectionString(...)来获取AMQP或SBMP具体的客户端类。这是获取QueueClient实例的唯一方法。

我可以理解为什么他们使用这种模式,因为ConnectionString指定了很多细节。

但是在单元测试中,这个QueueClient很难模仿,(至少Moq不能这样做);即使使用Microsoft Fakes,ShimQueueClient也只是您可以设置的一些方法的包装器,但您不能将其新建或作为参数下游传递。

我的问题是,当你决定出于某种原因使用这种模式时,你能做些什么来使它对测试更友好?

我能想到的东西就像你可以有一个静态方法允许你QueueClient.CreateForTest(),但对此感到奇怪;或者让这个QueueClient.CreateFromConnectionString取一个虚拟字符串(我已经通过给它一个非常短的'正确'字符串,以及在IntelliTrace中可以看到的一些捕获异常的成本)。

(注意:我并不是真的要求创建自己的IQueueClient等。)

非常感谢。

1 个答案:

答案 0 :(得分:3)

我建议您创建一个基本界面来支持这种模式。具有内部构造函数的抽象类将实现此接口,使其对伪造,moqing和替换具有灵活性。

Microsoft.ServiceBus QueueClient的情况下,我会在生产代码中使用我自己的接口实现decorate,这样我就可以在单元测试中伪造装饰器。