如何对适配器类进行单元测试?

时间:2019-12-19 22:26:32

标签: c# unit-testing nunit xunit

假设我具有来自第三方库的以下类:

public class ThirdPartyType { ... }

public class ThirdPartyFunction
{
    public ThirdPartyType DoSomething() { ... }
}

实现细节并不重要,它们实际上是我无法控制的该第三方库。

假设我为ThirdPartyFunction编写了一个适配器类:

public class Adapter
{
    private readonly ThirdPartyFunction f;

    public Adapter()
    {
        f = new ThirdPartyFunction();
    }

    public string DoSomething()
    {
        var result = f.DoSomething();

        // Convert to a type that my clients can understand
        return Convert(result);
    }

    private string Convert(ThirdPartyType value)
    {
        // Complex conversion from ThirdPartyType to string
        // (how do I test this private method?)
        ...
    }
}

如何测试Convert(ThirdPartyType)的实现是否正确? Adapter类只需要它,这就是为什么它是私有方法的原因。

1 个答案:

答案 0 :(得分:3)

我建议将代码提取到单独的类中,然后测试该类。尽管此Adapter仅使用它,但适配器也不应该负责进行转换(符合“单一职责原则”)。

通过将其提取出来,可以独立于第三方代码测试转换器。

如果转换器不需要任何状态,则还可以将其设为静态类,然后直接在适配器中引用它,而无需通过依赖注入进行注册。

如果您考虑一下,则适配器不需要测试(因为它只是包装器),而转换器则需要-因此将其提取到另一个类是有意义的以允许对其进行测试,即使它确实意味着另一个代码中的类。

此外,将转换器提取到单独的类意味着如果ThirdPartyTypestring的格式发生更改,则可以进行更改而不会影响Adapter的实现。 / p>

相关问题