繁体   English   中英

对依赖于httpclient响应的服务类进行单元测试

[英]Unit testing a service class with dependency on httpclient response

我有一个服务类,它在构造函数中注入了FlurlHttpClient

它具有一个公共方法,该方法使用httpClient进行调用,然后解析响应并返回一个类。 因此,基本上我想伪造API的响应并测试私有的parse-method。

如何对此进行单元测试? 我正在使用NUnit和FakeItEasy进行测试。 到目前为止,我已经知道了,但是如何确保使用来自API的伪造结果测试ParseResult方法?

到目前为止的代码:

单元测试:

[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);
    }
}

@Philippe已经提供了一个很好的答案(即使只是一个评论……),这也可以作为一种选择。

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

想象一下,如果有那么容易:

答:该方法是公共的,您要做的就是从字面上使用您想要的任何输入来调用它。 简单,没有嘲笑。

B.假设它所做的不仅是您共享的内容,您可以将其从此类中完全带入其自己的类,该类仅处理解析结果,并且再次进行测试而无需模拟就很简单了。

这将是一种实用的编码方式,并且使测试变得更加容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM