2012-02-28 79 views
0

我单元测试一个简单的帖子:单元测试的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”和“请求”显然将是零。

有嘲笑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; 
} 
+0

相关:http://stackoverflow.com/questions/10042290/sample-code-for-unit-testing-api-controllers/22200520#22200520 – 2014-03-06 10:06:59

回答

1

Request属性应该是可设置的,所以你只需要设置ControllerContext(它应该有一个无参数con结构,所以你甚至不应该模拟)。

0

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

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

} 

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

1

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

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

您可以使用MyTested.WebApi,它为您嘲笑一切。示例测试:

MyWebApi 
    .Controller<WebApiController>() 
    .Calling(c => c.SomeAction()) 
    .ShouldReturn() 
    .Ok() 
    .WithResponseModelOfType<ResponseModel>() 
    .Passing(m => 
    { 
     Assert.AreEqual(1, m.Id); 
     Assert.AreEqual("Some property value", m.SomeProperty); 
    });