[英]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.