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

Iva*_*nko 7 c# integration-testing unit-testing asp.net-core

我使用 .Net Core 2.0 创建 Web Api。我正在使用 Active Directory Graph API ( https://learn.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);
}
Run Code Online (Sandbox Code Playgroud)

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

// 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");
Run Code Online (Sandbox Code Playgroud)

或者也许是这样的接口的单元测试实现:

// 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);
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*ite 12

一个好的策略是永远不要模拟不属于您的代码。您应该有一层集成测试来实际调用 Azure AD 并证明它正在执行您想要的操作。

详细说明该策略:

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

在我看来,您的集成测试完全走在正确的轨道上。您正在编写自己的界面,并且仅公开您的代码需要的行为。您的集成测试证明这些方法确实符合您的预期 - 如果 Microsoft 做出重大更改,您的测试会告诉您。

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


Ser*_*hei 0

如果您需要测试 ADGraphService 类的行为,您应该使用带有模拟 HttpClient 的单元测试。为了测试与 Web 服务的集成,您应该在 HttpClient 上而不是在 ADGraphService 类上编写集成测试。