相关疑难解决方法(0)

使用Request.CreateResponse进行ASP.NET WebApi单元测试

我正在尝试为我的ApiController编写一些单元测试并遇到一些问题.有一个很好的扩展方法叫做Request.CreateResponse,可以帮助生成响应.

public HttpResponseMessage Post(Product product)
{
  var createdProduct = repo.Add(product);
  return this.Request.CreateResponse(HttpStatusCode.Created, createdProduct);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在不使用部分模拟或直接使用"new HttpResponseMessage(...)"的情况下模拟CreateResponse?

c# unit-testing mocking httpresponse asp.net-web-api

144
推荐指数
3
解决办法
5万
查看次数

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

我怎么能嘲笑HttpRequestMessage,特别是CreateResponse

var requestMessage = Substitute.For<HttpRequestMessage>();
requestMessage.CreateResponse().ReturnsForAnyArgs(
       new HttpResponseMessage(HttpStatusCode.OK));
Run Code Online (Sandbox Code Playgroud)

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

NSubstitute.Exceptions.CouldNotSetReturnDueToNoLastCallException: 
  'Could not find a call to return from.
Run Code Online (Sandbox Code Playgroud)

我已经看到了这些问题...... 如何在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");
}
Run Code Online (Sandbox Code Playgroud)

和实际测试,我想模拟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 …
Run Code Online (Sandbox Code Playgroud)

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

8
推荐指数
1
解决办法
4355
查看次数

从Mvc Action中获取WebApi UrlHelper的实例

我在同一个项目中运行WebApi和Mvc(所以它们在进程中).Mvc主要用于服务资产(页面和生成的下载)以及用于ajax数据请求的web api.

为了成为RESTish,大多数WebApi请求都包含一组由以下类生成的链接:

public class ApiLinkMaker
{
    public ApiLinkMaker(UrlHelper url, string authority) {
        this.url = url;
        this.authority = authority;
    }
    public ApiLinkMaker(ApiController controller)
        : this(controller.Url, controller.Request.RequestUri.Authority) { }

    public string MakeLink(string controller, string id) {
        return "//" + authority + url.Route("DefaultApi", new { controller = controller, id = id });
    }
}
Run Code Online (Sandbox Code Playgroud)

那里有一些其他的方法,但这确实是事情的核心,它运作良好.

现在我想优化特定页面.以前我有两个请求

  1. 下载html
  2. 执行Ajax查询以获取一些数据(以及一些链接)

现在我意识到,出于优化目的,在这种情况下最好只做一个.

  1. 下载嵌入了JSON数据的html.

问题是,由于html是由Mvc生成的,我无法创建似乎有用的Api UrlHelper.

我试过了

var url = new UrlHelper(new HttpRequestMessage(verb, controller.Request.Url.AbsoluteUri));
if (!url.Request.Properties.ContainsKey(HttpPropertyKeys.HttpConfigurationKey)) //http://stackoverflow.com/questions/11053598/how-to-mock-the-createresponset-extension-method-on-httprequestmessage
   url.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration());
Run Code Online (Sandbox Code Playgroud)

但这仍然会爆炸

System.ArgumentException was unhandled by user …
Run Code Online (Sandbox Code Playgroud)

asp.net asp.net-web-api

3
推荐指数
1
解决办法
4947
查看次数