【发布时间】:2017-12-27 14:41:50
【问题描述】:
如何模拟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.
我已经看到问题了...How to mock the CreateResponse<T> extension method on HttpRequestMessage
并关联...ASP.NET WebApi unit testing with Request.CreateResponse...
但他们似乎并没有真正最终嘲笑 CreateResponse
其他 cmets:
我正在尝试围绕 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");
}
【问题讨论】:
-
NSubstitute(和其他基于 DynamicProxy 的库)不能模拟扩展方法。
HttpRequestMessage没有virtual成员,因此大多数模拟库也无济于事。您能否提供有关您要测试的内容的更多信息?如果模拟在这里不能直接使用,那么我们可以讨论其他可能有帮助的选项。 :) -
@DavidTchepak 我已经在我的问题中添加了更多信息,关于我正在尝试做什么......
标签: c# unit-testing asp.net-web-api mocking nsubstitute