2012-02-28 4 views
0

나는 간단한 게시물을 테스트하는 단위입니다.단위 테스트 ASP.NET 웹 API

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 :

가 그것을 변경

이것은 더 나은 : 당신은이 때문에 Request 속성, 설정 가능해야한다

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 –

답변

1

ControllerContext을 설정해야합니다 (arg 인수가 없어야 함). structor이기 때문에 조롱을하지 않아도됩니다.)

0

메서드에서 매개 변수로 HttpRequestMessage를 수신 할 수 있습니다.

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

} 

RequestUri을 가져올 수 있습니다. 유닛 테스트에서 HttpRequestMessage 객체의 test double을 넣을 수 있습니다.

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); 
    });