适应Moq单元测试的接口

时间:2019-01-07 14:57:20

标签: c# unit-testing mocking

我在一个项目中遇到了问题,我们在其中遇到了一些第三方类的问题。问题在于我们无法从第三方实例化类,因为我们仅获得元数据表示,但是可以通过适配器模式来解决。问题在于我们需要进行单元测试的类实现了第三方接口:

public class OurClass: ThirdPartyInterface
{

}

这些接口返回第三方类(我们可以通过适配器模式包装这些类),但它们将作为原始类返回。因此,我们需要以某种方式创建某种适配器接口系统。

到目前为止,我们最好的主意是创建一个实现ThirdpartyInterface的类(FacadeThirdParty),然后将来自接口(TPClass)的第三方类包装到适配器类(TPClassAdapter)中,然后通过我们自己的接口发送它(OurClass)实现的(IFacadeThirdPartyInterface):

Diagram over our best idea

这样,我们可以Moq我们的IFacadeThirdPartyInterface和适配器类接口,而不会被第三方所打扰。这个主意好吗?我觉得可能会有更好的方法。

更新:提出了新的解决方案

因此,经过一番思考和评论中所说的话,我认为我有一个可行的新解决方案:

enter image description here

我可能没有很好解释的问题是第三方系统使用的回调函数。因此,我在这里所做的是,我们需要进行单元测试的“ OurClass”。现在它将与Facade层进行对话,并通过IFacadeCallback接口获取回调。所有第三方接口都将在facade类中实现。当这些接口之一执行对外观的调用时,它将通过IFacadeCallback外观将其重定向。如果调用具有第三方类,它将把它们包装在适配器类中并返回该类的接口(ITPClass)。从理论上讲,这应该隔离“ OurClass”,以便我可以使用Moq来测试其功能。

1 个答案:

答案 0 :(得分:0)

我要做的是代替使用适配器模式,而是将对第三方的依赖项注入到要测试的类中,例如

public class OurClass
{
    public OurClass(IThirdPartyInterface thirdParty)
    {
        _thirdParty = thirdParty;
    }
    private readonly IThirdPartyInterface _thirdParty;
}

接口IThirdPartyInterface将是一个简单的接口,具有您在ThirdPartyInterface类中的代码中所需的方法/属性。

通过这种方式,您可以轻松模拟此类具有的依赖项,此外,它还基于依赖关系反转原理。

相关问题