首页 > 解决方案 > 对依赖于 httpclient 响应的服务类进行单元测试

问题描述

FlurlHttpClient我有一个在构造函数中注入的服务类。

它有一个公共方法,该方法使用 进行调用httpClient,然后解析响应并返回一个类。所以基本上我想伪造来自 API 的响应并测试私有的解析方法。

我如何对此进行单元测试?我正在使用 NUnit 和 FakeItEasy 进行测试。到目前为止,我得到了这个,但是如何确保ParseResult使用 API 的伪造结果对 -method 进行测试?

到目前为止的代码:

单元测试:

[Test]
public void GetShipmentData_SuccessfullTracking_ReturnsValidEntity() {
  //Fake the service-class
  var sut = A.Fake<IApiClient>();
  using (var httpTest = new HttpTest()) {
    httpTest.RespondWithJson(GetJsonFromFile("../../../Assets/SuccessfullApiTrackingResponse.json"), 200);

    //This does not actually run the function on the service-class.
    var response = sut.TrackShipmentUsingReferenceNumber("fakeReferenceNumber");

    Assert.IsTrue(response.SuccessfullShipmentTracking);
    Assert.IsNotNull(response.ApiResponseActivity);
  }
}

API 类:

public class ApiClient : IApiClient {

    readonly ILogger _logger;
    private readonly IFlurlClient _httpClient;

    public ApiClient(IFlurlClientFactory flurlClientFac) {
      _httpClient = flurlClientFac.Get(ApiClientConfiguration.BaseAdress);
    }

    public ApiResponse TrackShipmentUsingReferenceNumber(string referenceNumber) {
      var request = GenerateApiRequestUsingReferenceNumber(referenceNumber);
      var response = _httpClient.Request("Track").PostJsonAsync(request).ReceiveString();

      return ParseResult(response.Result);
    }

    private ApiResponse ParseResult(string input) {
        //Shortened
      return = JObject.Parse<ApiResponse>(input);
    }
}

标签: c#.netnunitfakeiteasyflurl

解决方案


@Philippe 已经提供了一个很好的答案(即使它只是一个评论......),这是一个替代方案。

这是我不想嘲笑任何事情的情况之一。您要测试的是私有方法,该方法将字符串作为输入。

想象一下,如果:

A. 这个方法是公开的,你所要做的就是用你想要的任何输入来调用它。简单,不嘲讽。

B. 假设它所做的不仅仅是您共享的内容,您可以将它完全从这个类中取出到它自己的类中,它只处理解析结果,并且再次,在没有模拟的情况下进行测试将是微不足道的。

这将是一种功能性的编码方式,它使测试变得更加容易。


推荐阅读