【问题标题】:How to test 3rd party APIs. Should I create unit or integration tests?如何测试 3rd 方 API。我应该创建单元测试还是集成测试?
【发布时间】:2017-11-02 16:30:00
【问题描述】:

我使用 .Net Core 2.0 创建 Web Api。我正在使用 Active Directory Graph 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);

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

【问题讨论】:

  • 如果您需要集成测试,为什么不呢?它看起来不错。只是 CreateUser 是安排的一部分而不是行动
  • @Serghei 只是想知道,这是最好的选择。我在 Google 上搜索了很多文章,他们告诉我应该模拟 3rd 方 API 提供的结果。
  • 如果您要模拟 3rd 方 API,例如 WebService 等,那么在我的日常工作中,这将是一个单元测试而不是集成测试,我会同时使用它们。你可以在这里阅读stackoverflow.com/questions/10752/…
  • 我稍微编辑了问题。我实际上有一个单元测试,并将其添加到我的问题中。问题是哪种情况更适合这种情况?单元测试还是集成测试?
  • 第二个单元测试更好,因为您想测试我在下面回答的 ADGraphService 类的行为

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


【解决方案1】:

一个好的策略是永远不要模拟你不拥有的代码。你应该有一个真正调用 Azure AD 的集成测试层,并证明它正在做你想做的事情。

详细说明策略:

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

在我看来,您的集成测试完全正确。您正在编写自己的界面,并且只公开您的代码需要的行为。您的集成测试证明这些方法确实按照您的意愿行事 - 如果 Microsoft 做出重大更改,您的测试会告诉您。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 2021-12-19
      • 2014-09-01
      • 2011-05-15
      • 1970-01-01
      相关资源
      最近更新 更多