.NET Web Api에 대한 경험이 많지 않지만 Pluralsight에 대한 John Papa의 SPA 응용 프로그램 자습서를 따라 오면서 잠깐 작업 해 왔습니다. 응용 프로그램은 정상적으로 작동하지만, 지금 당장 고민하고있는 것은 단위 테스트 POST 컨트롤러입니다.단위 테스트 후 컨트롤러 .NET Web Api
단위 테스트 웹 API 컨트롤러에 대한이 놀라운 가이드를 따라 왔습니다. 나를위한 유일한 문제는 POST 메서드를 테스트 할 때입니다.
내 컨트롤러는 다음과 같습니다
[ActionName("course")]
public HttpResponseMessage Post(Course course)
{
if (course == null)
throw new HttpResponseException(HttpStatusCode.NotAcceptable);
try
{
Uow.Courses.Add(course);
Uow.commit();
}
catch (Exception)
{
throw new HttpResponseException(HttpStatusCode.InternalServerError);
}
var response = Request.CreateResponse(HttpStatusCode.Created, course);
string uri = Url.Link(routeName: "ControllerActionAndId",
routeValues: new { id = course.Id });
response.Headers.Location = new Uri(uri);
return response;
}
그리고 내 단위 테스트는 다음과 같습니다
public static void SetupPostControllerForTest(ApiController controller)
{
var config = new HttpConfiguration();
var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/api/courses/course");
var route = config.Routes.MapHttpRoute(
name: "ControllerActionAndId",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: null,
constraints: new { id = @"^\d+$" }
);
var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { "controller", "courses" }, { "action", "course" } });
controller.ControllerContext = new HttpControllerContext(config, routeData, request);
controller.Request = request;
controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config;
}
내가 단위 테스트를 디버깅 : 도움말 기능으로
[Test]
public void PostShouldReturnHttpResponse()
{
var populatedPostController = new CoursesController(new TestUOW());
SetupPostControllerForTest(populatedPostController);
var course = new Course
{
Id = 12,
Author = new UserProfile()
{
Firstname = "John",
Lastname = "Johnson",
},
Description = "Testcourse",
Title = "Test Title"
};
var responses = populatedPostController.Post(course);
ObjectContent content = responses.Content as ObjectContent;
Course result = (Course)content.Value;
Assert.AreSame(result, course);
}
그것은 다음과 같이 실패합니다 :
string uri = Url.Link(routeName: "ControllerActionAndId",
routeValues: new { id = course.Id });
response.Headers.Location = new Uri(uri); //Exception because uri = null
Url.Link에서 경로를 찾을 수없는 것 같습니다.
나는 또한 this 가이드를 시도했지만 위의 예제가 실제로 필요합니다.
내가 여기에 정말 기본적인 것을 놓치고 있습니까?
'SetupPostControllerForTest' 메쏘드의 끝에 다음 줄을 추가하려고 시도하십시오. controller.Request.Properties [HttpPropertyKeys.HttpRouteDataKey] = routeData; – nemesv
네, 이제 작동합니다! 그것은 피곤할 때 일어나는 일입니다. 고마워요! –