具有抽象和内部构造函数的C#工厂模式,在单元测试下

具有抽象和内部构造函数的C#工厂模式,在单元测试下,c#,unit-testing,abstract-class,factory-pattern,internal,C#,Unit Testing,Abstract Class,Factory Pattern,Internal,我心目中的是Microsoft.ServiceBus队列客户端 因此,QueueClient是抽象类,具有内部构造函数;我们调用QueueClient.CreateFromConnectionString(…)来获取AMQP或SBMP具体的客户端类。这是获取QueueClient实例的唯一方法 考虑到ConnectionString指定了大量细节,我可以理解他们为什么使用这种模式 但是在单元测试中,这个QueueClient很难模仿(至少Moq不能模仿);即使使用Microsoft Fakes,

我心目中的是
Microsoft.ServiceBus队列客户端

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

考虑到
ConnectionString
指定了大量细节,我可以理解他们为什么使用这种模式

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

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

我能想到的一些东西,比如你可以有一个静态方法,允许你
QueueClient.CreateForTest()
,但是对此感到奇怪;或者使用这个
QueueClient.CreateFromConnectionString
来获取伪字符串(我已经这样做了,给它一个非常短的“正确”字符串,代价是您可以在IntelliTrace中看到一些捕获到的异常)

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

非常感谢


Dong

我建议您创建一个基本接口来支持此模式。带有内部构造函数的抽象类将实现此接口,使其能够灵活地进行伪造、伪造和替换


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

在QueueClient的情况下,它的签名是:
公共抽象类QueueClient:MessageClientEntity,IMessageSessionEntity,IMessageSender,IMessageReceiver,IMessageBrowser
您的意思是说您应该拥有一个IQueueClient,其中包含所有这些,然后您就可以
队列客户端:IQueueClient
?我也想知道这是否也是一个好的模式。@Xie对两个问题都回答是。见IList<代码>公共接口IList:ICollection,IEnumerable。允许在需要实现
ICollection
IEnumerable
的对象时使用
IList
。顺便说一句,我们无法从QueueClient继承,因为它有两种方法是
内部抽象
@Xied。您需要使用装饰器或适配器模式装饰QueueClient