首页 > 解决方案 > 如何在“天蓝色函数”上模拟 HttpRequest

问题描述

我有一个带有 Http 触发器的函数

public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function,"post", Route = null)] HttpRequest req)

我想模拟请求。我已经设法做到了,就像这样

private static Mock<HttpRequest> CreateMockRequest(object body)
{            
    using var memoryStream= new MemoryStream();
    using var writer = new StreamWriter(memoryStream);
 
    var json = JsonConvert.SerializeObject(body);
 
    writer .Write(json);
    writer .Flush();
 
    memoryStream.Position = 0;
 
    var mockRequest = new Mock<HttpRequest>();
    mockRequest.Setup(x => x.Body).Returns(memoryStream);
    mockRequest.Setup(x => x.ContentType).Returns("application/json");

    return mockRequest;
}

body,在上面的代码中只是一些 json. 然后我使用这段代码反序列化填充在 mockRequest 主体中的 json

public static async Task<HttpResponseBody<T>> GetBodyAsync<T>(this HttpRequest req)
    using var stream = new StreamReader(req.Body);
    var bodyString = await stream.ReadToEndAsync();
...
}

bodyString 在这里不是有效的 json,因为 json 中的引号似乎被转义了,例如 Original Json ={"x": "somexvalue"} 返回的值 ={\"x\": \"somexvalue\"

在你说这只是 Visual Studio 调试检查器之前,它不是。我检查过。似乎StreamWriter正在这样做或正在这样做StreamReader

显而易见的解决方案是从生成的 json 中删除 \ ,但这感觉非常错误并且工作范围很广。有没有办法解决这个问题而不必改变我的功能。

标签: c#jsonasp.net-coremockingazure-functions

解决方案


所以,问题出在StreamWritter. 解决方法就是不使用StreamWritter. @ColinM 在正确的路线上。这是模拟身体的方式

    var json = JsonConvert.SerializeObject(body);

    var memoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(json));

    var context = new DefaultHttpContext();
    var request = context.Request;
    request.Body = memoryStream;
    request.ContentType = "application/json";

    return request;

推荐阅读