c# - 我如何模拟 HttpRequestMessage,特别是 CreateResponse?

标签 c# unit-testing asp.net-web-api mocking nsubstitute

如何模拟 HttpRequestMessage,特别是 CreateResponse

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

但我得到了异常(exception)...

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

我看过问题... How to mock the CreateResponse<T> extension method on HttpRequestMessage

与相关... ASP.NET WebApi unit testing with Request.CreateResponse ...

但他们似乎并没有真正结束 mock 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");
}

最佳答案

这里不需要模拟任何东西。对于这个测试,一切都可以安全地 stub 。 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);
}

关于c# - 我如何模拟 HttpRequestMessage,特别是 CreateResponse?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45239471/

相关文章:

c# - 更改参数名称 Web Api 模型绑定(bind)

c# - Web API 核心 : "FOREIGN KEY constraint failed" error during POST request SQLite

c# - 显示空白的 XML 元素值

java - CompletableFuture runAsync内部的单元测试代码

c# - 为什么我不能使用具有继承接口(interface)的相同泛型类型?

ios - OCMockito:验证模拟的方法在将来的某个时候被调用

javascript - 错误 : Argument 'MainCtrl' is not a function, 未定义

c# - 排除 ODataConventionModelBuilder 中实现的接口(interface)

c# - 如何以编程方式在 ASP.NET 4.0 GridView 上启用分页和排序?

c# - 在 C# 中使用 Lua 的最有效方法是什么?