带有抽象和内部构造函数的C#工厂模式,正在进行单元测试
本文关键字:模式 工厂 正在进行 单元测试 抽象 内部 构造函数 | 更新日期: 2023-09-27 18:00:19
在我的脑海中是Microsoft.ServiceBus QueueClient
所以QueueClient
是一个抽象类,有一个内部构造函数;我们调用QueueClient.CreateFromConnectionString(...)
来获得AMQP或SBMP具体客户端类。这是获得QueueClient
实例的唯一方法。
我可以理解他们为什么使用这种模式,因为ConnectionString
指定了很多细节。
但在单元测试下,这个QueueClient
很难模仿(至少Moq做不到);即使使用Microsoft Fakes,ShimQueueClient
也只是一个包装器,其中包含一些可以设置的方法,但不能新建它或将其作为参数传递到下游。
我的问题是,当你出于任何原因决定使用这种模式时,你能做些什么让它对测试更友好?
我可以想到一些东西,比如你可以有一个静态方法允许你QueueClient.CreateForTest()
,但对此感到奇怪;或者使这个QueueClient.CreateFromConnectionString
采用伪字符串(我已经这样做了,给它一个很短的"正确"字符串,代价是您可以在IntelliTrace中看到一些捕获的异常)。
(注意:我并不是真的要求创建自己的IQueueClient
等)
非常感谢。
董
我建议您创建一个基本接口来支持这种模式。具有内部构造函数的抽象类将实现此接口,使其能够灵活地进行伪造、moqing和替换。
在Microsoft.ServiceBus QueueClient
的情况下,我会在生产代码中用自己的接口实现来装饰它,这样我就可以在单元测试中伪造装饰器。