使用 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;
}
Run Code Online (Sandbox Code Playgroud)
使用 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");
}
}
Run Code Online (Sandbox Code Playgroud)
测试方法执行后出现以下错误
响应也不能反序列化
如果我需要添加更多详细信息,请告诉我。
请建议我做错了什么。
预期结果 我想在调用主服务方法时模拟请求和响应,但不幸的是我无法做到
我认为问题是你的测试的安排步骤:
httpTest.RespondWith("OK", 200).RespondWithJson(applicationItemVm);
Run Code Online (Sandbox Code Playgroud)
每次调用RespondWith*都会向队列添加一个新的假响应,因此这里您将 2 个响应放入队列。当在您的测试主题中进行 HTTP 调用时,Flurl 将使第一个调用出列,并使用该响应伪造该调用,因此您将返回"OK"到响应正文,这显然不会 JSON 反序列化为您的ApplicationItemVm类型。这就是失败发生的地方。
要解决此问题,只需在安排步骤中加入一个响应即可:
httpTest.RespondWithJson(applicationItemVm, 200);
Run Code Online (Sandbox Code Playgroud)
200 是虚假回复的默认值,因此您甚至可以将其省略,除非您为了可读性而喜欢它。
| 归档时间: |
|
| 查看次数: |
4575 次 |
| 最近记录: |