单元测试ASP.NET Web API

本文关键字:API Web NET ASP 单元测试 | 更新日期: 2023-09-27 18:26:11

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

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"answers"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; 
}

单元测试ASP.NET Web API

Request属性应该是可设置的,所以您只需要设置ControllerContext(它应该有一个无arg构造函数,所以您甚至不应该进行mock)。

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

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

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

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

您可以从中获取RequestUri。在单元测试中,您可以放置HttpRequestMessage对象的测试替身。