如何对第三方库包装器进行单元测试?

Ele*_*erm 6 unit-testing

每个人都告诉不要嘲笑你不拥有的东西.他们建议改为为第三方库创建一个包装器.

但是我该如何测试这个包装器呢?

我的意思是,如果我为它编写单元测试并且会模拟那些第三方接口来测试我的包装器,那么什么都不会改变.如果库维护者将更改其API,我将面临同样的问题 - 对于模拟库的测试将会很好,软件将在生产环境中失败.这里可靠性或可测试性的优势是什么?

我知道代码质量有优势,因为我可以随时交换这个库,但它不是这个问题的主题.

谢谢.

Nko*_*osi 6

对您的 3rd 方库抽象进行单元测试以确保您的代码按预期运行,然后对 3rd 方库进行集成测试以确保这些集成的行为符合预期。如果那些 3rd 方库有您可以安全测试的沙盒,那就更好了。

例如,如果您的系统正在测试一个依赖于 3rd 方库的系统,但您想在不调用实际库的情况下对其进行单元测试。您可以手动或使用模拟框架提供第 3 方接口的模拟实现。

public interface IExteralContract {
    List<string> DoSomething(params string[] args);
}

[TestMethod]
public void SUT_Should_Be_True {
    //Arrange
    IExteralContract mock = new MockExternalContract();
    var sut = new MyClass(mock);
    //Act
    var actual = sut.DoSomethingElse();
    //Assert
    Assert.IsTrue(actual);
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,被测系统是依赖于 3rd 方接口的类之一。

对于您的集成测试,被测系统是实际的第 3 方包装器,以确保它按预期运行。

public class ConcreteExternalWrapper : IExteralContract {
   public List<string> DoSomething(params string[] args){
       //Actual calling of 3rd party libraries
   }
}

[TestMethod]
public void Third_Party_Service_Should_Return_Data {
    //Arrange
    IExteralContract sut = new ConcreteExternalWrapper ();
    int expected = 3;
    //Act
    var actual = sut.DoSomething("arg1", "arg2", "arg3");
    //Assert
    Assert.IsNotNull(actual);
    Assert.AreEqual(expected, actual.Count);
}
Run Code Online (Sandbox Code Playgroud)

这样,如果库维护者更改其 API,该行为将导致预期行为失败。

希望这能满足您的要求。