如何在“azure 函数”上模拟 HttpRequest

Taf*_*rwa 5 c# json mocking asp.net-core azure-functions

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

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

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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();
...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Taf*_*rwa 4

所以,问题出在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;
Run Code Online (Sandbox Code Playgroud)