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

非常感谢。

带有抽象和内部构造函数的C#工厂模式,正在进行单元测试

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

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