Модульное тестирование ASP.NET Web API - PullRequest
0 голосов
/ 28 февраля 2012

Я юнит тестирую простой пост:

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» и «запрос», очевидно, будут нулевыми.

Есть ли альтернатива моделированию 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; 
}

Ответы [ 3 ]

1 голос
/ 17 января 2013

Используя FakeItEasy, я заставил его работать в TestInitialize.

this.Controller.ControllerContext = new System.Web.Http.Controllers.HttpControllerContext();
this.Controller.Request = A.Fake<HttpRequestMessage>();
1 голос
/ 28 февраля 2012

Свойство Request должно быть настраиваемым, так что вам нужно только установить ControllerContext (который должен иметь конструктор без аргументов, поэтому вам даже не придется имитировать).

0 голосов
/ 20 марта 2012

Ваш метод может получить HttpRequestMessage в качестве параметра.

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

} 

Вы можете взять RequestUri из него.В ваших модульных тестах вы можете поместить двойную проверку объекта HttpRequestMessage.

...