单元测试 - Flurl ,如何模拟 flurl 请求响应?
Unit testing - Flurl , How to mock flurl request response?
主要服务实现使用flurl
Public async Task<ApplicationItemVm> UpdateOpportunityInfo(string optyNumber, UpdateOpportunityVm model, string token = "")
{
var result = await "https://api.com/*"
.WithOAuthBearerToken(token)
.PatchJsonAsync(model)
.ReceiveJson<ApplicationItemVm>();
return result;
}
使用 MS 测试的测试方法
[TestMethod]
public async Task UpdateOppTest()
{
var updateOpportunityVm = new UpdateOpportunityVm
{
AboutYouIConfirm_c = true
};
var applicationItemVm = new ApplicationItemVm { AboutYouIConfirm_c=true};
// fake & record all http calls in the test subject
using (var httpTest = new HttpTest())
{
// arrange
httpTest.
RespondWith("OK", 200).RespondWithJson(applicationItemVm);
// act
var application = await applicationService.UpdateOpportunityInfo("optyNumber", updateOpportunityVm, "CloudToken");
// assert
httpTest.ShouldHaveCalled("https://api.com/*")
.WithVerb(HttpMethod.Patch)
.WithContentType("application/json");
}
}
执行测试方法后出现以下错误
响应无法反序列化
如果我需要添加更多详细信息,请告诉我。
请指出我做错了什么。
预期结果
我想在调用主要服务方法时模拟请求和响应,但不幸的是我做不到
我认为问题是你测试的安排步骤:
httpTest.RespondWith("OK", 200).RespondWithJson(applicationItemVm);
每次调用 RespondWith*
都会向队列中添加一个新的假响应,所以在这里您要排队 2 个响应。当在您的测试主题中进行 HTTP 调用时,Flurl 将使第一个出队并使用该响应伪造调用,因此您将 "OK"
返回响应主体,这显然不会 JSON-反序列化为您的 ApplicationItemVm
类型。那就是发生故障的地方。
要解决此问题,只需在您的排列步骤中加入一个响应:
httpTest.RespondWithJson(applicationItemVm, 200);
200 是假响应的默认值,因此您甚至可以将其省略,除非您为了便于阅读而喜欢它。
主要服务实现使用flurl
Public async Task<ApplicationItemVm> UpdateOpportunityInfo(string optyNumber, UpdateOpportunityVm model, string token = "")
{
var result = await "https://api.com/*"
.WithOAuthBearerToken(token)
.PatchJsonAsync(model)
.ReceiveJson<ApplicationItemVm>();
return result;
}
使用 MS 测试的测试方法
[TestMethod]
public async Task UpdateOppTest()
{
var updateOpportunityVm = new UpdateOpportunityVm
{
AboutYouIConfirm_c = true
};
var applicationItemVm = new ApplicationItemVm { AboutYouIConfirm_c=true};
// fake & record all http calls in the test subject
using (var httpTest = new HttpTest())
{
// arrange
httpTest.
RespondWith("OK", 200).RespondWithJson(applicationItemVm);
// act
var application = await applicationService.UpdateOpportunityInfo("optyNumber", updateOpportunityVm, "CloudToken");
// assert
httpTest.ShouldHaveCalled("https://api.com/*")
.WithVerb(HttpMethod.Patch)
.WithContentType("application/json");
}
}
执行测试方法后出现以下错误
响应无法反序列化
如果我需要添加更多详细信息,请告诉我。
请指出我做错了什么。
预期结果 我想在调用主要服务方法时模拟请求和响应,但不幸的是我做不到
我认为问题是你测试的安排步骤:
httpTest.RespondWith("OK", 200).RespondWithJson(applicationItemVm);
每次调用 RespondWith*
都会向队列中添加一个新的假响应,所以在这里您要排队 2 个响应。当在您的测试主题中进行 HTTP 调用时,Flurl 将使第一个出队并使用该响应伪造调用,因此您将 "OK"
返回响应主体,这显然不会 JSON-反序列化为您的 ApplicationItemVm
类型。那就是发生故障的地方。
要解决此问题,只需在您的排列步骤中加入一个响应:
httpTest.RespondWithJson(applicationItemVm, 200);
200 是假响应的默认值,因此您甚至可以将其省略,除非您为了便于阅读而喜欢它。