具有抽象和内部构造函数的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