繁体   English   中英

单元测试ASP.NET Web API

[英]Unit Testing ASP.NET Web API

我正在测试一个简单的帖子:

public HttpResponseMessage<Document> PostDocument(Document document) 
{
    document = repository.Add(document); 

    var response = new HttpResponseMessage<Document>(document, HttpStatusCode.Created); 

    var uri = Url.Route(null, new { id = document.Id }); 

    response.Headers.Location = new Uri(Request.RequestUri, uri); 

    return response; 
}

但是,'URL'和'Request'显然是null。

有没有替代模拟出ControllerContext和HttpContext?

更新:

将其更改为:

 public HttpResponseMessage<Document> PostDocument(Document document,Uri location = null) 
{
    document = repository.Add(document); 

    var response = new HttpResponseMessage<Document>(document, HttpStatusCode.Created);

    if (location == null)
    {
        var uri = Url.Route(null, new { id = document.Id });
        location = new Uri(Request.RequestUri, uri);
    }

    response.Headers.Location = location;

    return response; 
}

更新2:

这个更好:

public HttpResponseMessage<Document> PostDocument(Document document)
{
    var uri = Url.Route(null, new { id = document.Id });
    var location = new Uri(Request.RequestUri, uri);

    return PostDocument(document, location);
}

[NonAction]
public HttpResponseMessage<Document> PostDocument(Document document, Uri location) 
{
    document = repository.Add(document); 

    var response = new HttpResponseMessage<Document>(document, HttpStatusCode.Created);
    response.Headers.Location = location;
    return response; 
}

使用FakeItEasy我在TestInitialize中完成了这项工作。

this.Controller.ControllerContext = new System.Web.Http.Controllers.HttpControllerContext();
this.Controller.Request = A.Fake<HttpRequestMessage>();

Request属性应该是可设置的,所以你只需要设置ControllerContext (它应该有一个no-arg构造函数,所以你甚至不必模拟)。

您的方法可能会将HttpRequestMessage作为参数接收。

 public HttpResponseMessage<Document> PostDocument(Document document, HttpRequestMessage message)
{

} 

您可以从中获取RequestUri。 在单元测试中,您可以将HttpRequestMessage对象的测试加倍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM