簡體   English   中英

我如何模擬HttpRequestMessage,特別是CreateResponse?

[英]How can I mock HttpRequestMessage, specifically the CreateResponse?

我如何模擬HttpRequestMessage ,特別是CreateResponse

var requestMessage = Substitute.For<HttpRequestMessage>();
requestMessage.CreateResponse().ReturnsForAnyArgs(
       new HttpResponseMessage(HttpStatusCode.OK));

但我得到例外......

NSubstitute.Exceptions.CouldNotSetReturnDueToNoLastCallException: 
  'Could not find a call to return from.

我已經看到了這些問題...... 如何在HttpRequestMessage上模擬CreateResponse <T>擴展方法

並關聯... 使用Request.CreateResponse的ASP.NET WebApi單元測試 ...

但他們似乎並沒有真正嘲笑CreateResponse

附加評論:

我正在嘗試圍繞Azure預編譯C#函數的啟動程序編寫單元測試...

[FunctionName("Version")]
public static HttpResponseMessage Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]
    HttpRequestMessage req,
    TraceWriter log)
{
    log.Info("Version function processed a request ... ");

    return req.CreateResponse(HttpStatusCode.OK, "Version 0.0.1");
}

和實際測試,我想模擬HttpRequestMessage,特別是我得到錯誤的CreateReponse是...

[TestMethod]
public void Version_returns_value()
{
    var requestMessage = Substitute.For<HttpRequestMessage>();
    requestMessage.CreateResponse(Arg.Any<HttpStatusCode>(), Arg.Any<string>())
                  .Returns(new HttpResponseMessage(HttpStatusCode.OK));
    var log = new CustomTraceWriter(TraceLevel.Verbose);

    var httpResponseMessage = VersionFunction.Run(requestMessage, log);
    var httpContent = httpResponseMessage.Content;

    httpContent.Should().Be("Version 0.0.1 :: valid");
}

這里不需要嘲笑任何東西。 對於此測試,一切都可以安全存根。 CreateResponse是一種擴展方法,在內部使用請求的關聯HttpConfiguration 這是在測試中使用它之前需要設置的唯一要求。

有了這個,如果您按如下方式更新測試,您應該能夠正確地進行測試。

[TestMethod]
public async Task Version_returns_value() {
    var expected = "\"Version 0.0.1\"";
    var config = new HttpConfiguration();
    var requestMessage = new HttpRequestMessage();
    requestMessage.SetConfiguration(config);

    var log = new CustomTraceWriter(TraceLevel.Verbose);

    var httpResponseMessage = VersionFunction.Run(requestMessage, null);
    var httpContent = httpResponseMessage.Content;
    var content = await httpContent.ReadAsStringAsync();

    content.Should().Be(expected);
}

暫無
暫無

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

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