c# - 对依赖于 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);
}
}
解决方案
@Philippe 已经提供了一个很好的答案(即使它只是一个评论......),这是一个替代方案。
这是我不想嘲笑任何事情的情况之一。您要测试的是私有方法,该方法将字符串作为输入。
想象一下,如果:
A. 这个方法是公开的,你所要做的就是用你想要的任何输入来调用它。简单,不嘲讽。
B. 假设它所做的不仅仅是您共享的内容,您可以将它完全从这个类中取出到它自己的类中,它只处理解析结果,并且再次,在没有模拟的情况下进行测试将是微不足道的。
这将是一种功能性的编码方式,它使测试变得更加容易。
推荐阅读
- node.js - 使用nodeJS从excel中获取下拉值
- character-encoding - 狮身人面像搜索:结果中缺少重音符号/变音符号
- ios - 集合视图的委托/数据源方法在哪些队列中执行?
- python - 与 defaultdict 结合使用时,计数器排序丢失
- javascript - wpcf7 和 GTM 事件监听器 -> 标签触发问题
- java - 添加链接以编辑文本并将它们存储在firebase数据库中时链接消失
- sql - SQL Server 在列中搜索相同文本的多个实例
- iis - IIS web.config 使子文件夹无法使用,但在一个域上
- amazon-web-services - 我可以在没有负载均衡器的情况下为 AWS lightail 设置 ssl 证书吗?
- android - Android Volley:将图像上传为字符串时出现 CalledFromWrongThreadException