单元测试 - 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 是假响应的默认值,因此您甚至可以将其省略,除非您为了便于阅读而喜欢它。