如何测试第三方API。我应该创建单元测试还是集成测试?

时间:2017-11-02 16:30:01

标签: c# unit-testing asp.net-core integration-testing

我使用.Net Core 2.0创建Web Api。我使用Active Directory图谱API(https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-devquickstarts-graph-dotnet)来执行创建新用户。我使用这样的接口

创建了IADGraphService
interface IADGraphService 
{
    bool CreateUser(UserModel model);
    IList<UserModel> GetUsers();
    bool UpdateUser(UserModel model);
    bool DeleteUser(string userObjectId);
}

我正在考虑创建集成测试,如:

// arrange
var service = new ADGraphService();

// act
bool result = service.CreateUser(new UserModel(){ Email = "test@example.com", ..... });
var users = service.GetUsers();

// assert
result.Should().Be(true);
users.Should().Contain(user => user.Email == "test@example.com");

或者可能是这种界面的单元测试实现:

// arrange
......
var fakeHttpClient = new Mock<IHttpClient>();
fakeHttpClient.Setup(x => x.PostAsync(url, userModelContent)).Returns(mockJsonResult);
var service = new ADGraphService(fakeHttpClient.Object);

// act
var result = service.CreateUser(new UserModel { Email = "test@example.com", .......});

// assert 
result.Should().Be(true);

这种情况应该使用哪一个?

2 个答案:

答案 0 :(得分:3)

一个好的策略是永远不会模仿你不拥有的代码。你应该有一层实际上称为Azure AD的集成测试并证明它正在做你做的事情打算。

详细说明策略:

  • 围绕第三方代码编写一个瘦包装器,仅公开代码实际需要的操作。 (看起来您已经使用ADGraphService / IADGraphService完成了此操作。)
  • 编写测试瘦包装器(ADGraphService)的集成测试,并证明其公共操作确实按照您的意图运行。
  • 然后,当您测试更高级别的对象时,可以对IADGraphService使用模拟。您已经证明(通过集成测试)您了解了包装器应该如何工作,因此您可以模拟合理的行为。

听起来像你一样,通过集成测试确定了正确的轨道。您正在编写自己的界面,并且只公开您的代码所需的行为。您的集成测试证明这些方法实际上符合您的意图 - 如果Microsoft做出重大更改,您的测试会告诉您。

然后,当您测试更高级别的代码(使用IADGraphService的代码)时,您可以模拟IADGraphService,因为它拥有您自己的代码,您可以安全地模拟它。

答案 1 :(得分:0)

如果您需要测试类ADGraphService的行为,则应使用Mocked HttpClient进行单元测试。对于与Web服务的测试集成,您应该在HttpClient上编写Integration测试,而不是在类ADGraphService上编写。