【发布时间】:2019-01-08 20:05:22
【问题描述】:
我在一个项目中遇到了问题,其中一些第三方类存在问题。问题是我们无法从第三方实例化类,因为我们只能获得元数据表示,但我们可以通过适配器模式来解决这个问题。问题是我们需要单元测试的类实现了第三方接口:
public class OurClass: ThirdPartyInterface
{
}
这些接口返回第三方类(我们可以通过适配器模式包装的那些),但它们会作为原始类返回。所以我们需要以某种方式创建某种适配器接口系统。
目前我们最好的想法是创建一个实现ThirdpartyInterface的类(FacadeThirdParty),然后将来自接口(TPClass)的第三方类包装成一个适配器类(TPClassAdapter),然后通过我们自己的接口发送“OurClass”实现的(IFacadeThirdPartyInterface):
这样我们可以Moq我们的IFacadeThirdPartyInterface和适配器类接口,而不会被第三方打扰。这个想法有什么好处吗?我觉得可能有更好的方法来做到这一点。
更新:新提议的解决方案
所以经过一些想法和 cmets 中所说的话,我认为我有一个可行的新解决方案:
我遇到的问题是第三方系统使用的回调函数,我可能没有很好地解释。所以,我在这里所做的是我们有我需要进行单元测试的“OurClass”。它现在将与 Facade 层对话并通过 IFacadeCallback 接口获取回调。所有第三方接口都将在外观类中实现。当这些接口之一执行对外观的调用时,它将通过 IFacadeCallback 外观重定向它。如果调用有第三方类,它会将它们包装在适配器类中并返回该类的接口(ITPClass)。理论上,这应该隔离“OurClass”,以便我可以使用 Moq 来测试它的功能。
【问题讨论】:
-
完全抽象出第 3 方的依赖关系。如您所见,与您无法控制的问题紧密耦合会使事情变得困难。
-
@Nkosi 那么像我更新帖子的新解决方案一样吗?你是这么想的吗?
标签: c# unit-testing mocking