簡體   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