簡體   English   中英

如何在“天藍色函數”上模擬 HttpRequest

[英]How do I mock the HttpRequest on an "azure function"

我有一個 function 和一個 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;
}

正文,在上面的代碼中只是一些 json。然后我使用這段代碼反序列化這個 json 填充在 mockRequest 的正文中

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 中引號的 escaping eg Original Json = {"x": "somexvalue"} the value coming back = {\"x\": \"somexvalue\"

在你說這只是 visual studio 調試檢查器之前,它不是。 我檢查過。 似乎StreamWriter正在這樣做,或者StreamReader正在這樣做。

顯而易見的解決方案是將 \ 從生成的 json 中去掉,但這感覺很不對,而且工作范圍很廣。 有沒有辦法解決這個問題而不必更改我的 function.

所以,問題出在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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM