单元测试 - Flurl,如何模拟 flurl 请求响应?

Yog*_*rpe 1 c# api tdd flurl

使用 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)

测试方法执行后出现以下错误

响应也不能反序列化

如果我需要添加更多详细信息,请告诉我。

请建议我做错了什么。

预期结果 我想在调用主服务方法时模拟请求和响应,但不幸的是我无法做到

Tod*_*ier 5

我认为问题是你的测试的安排步骤:

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 是虚假回复的默认值,因此您甚至可以将其省略,除非您为了可读性而喜欢它。