Nie mam dużego doświadczenia z .NET Web Api, ale pracuję nad tym od jakiegoś czasu, korzystając z tutoriala do aplikacji SPA Papai na Pluralsight. Aplikacja działa dobrze, ale rzeczą, z którą teraz walczę, jest testowanie POST kontrolerów.Jednostka testująca kontroler poczty .NET Web Api
Podążyłem za tym niesamowitym przewodnikiem na temat testowania kontrolerów internetowych. Jedynym problemem jest dla mnie testowanie metody POST.
Mój kontroler wygląda następująco:
[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;
}
A mój testów jednostkowych wygląda następująco:
[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);
}
Z funkcji pomocy:
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;
}
Kiedy debugować badanej jednostki , wygląda na to, że nie działa pod adresem:
string uri = Url.Link(routeName: "ControllerActionAndId",
routeValues: new { id = course.Id });
response.Headers.Location = new Uri(uri); //Exception because uri = null
Wygląda na to, że adres Url.Link nie może znaleźć trasy.
Próbowałem również this przewodnik, ale naprawdę chcę mieć przykład powyżej do pracy.
Czy brakuje tu czegoś naprawdę podstawowego?
Spróbuj dodać następujący wiersz na końcu 'SetupPostControllerForTest' method' controller.Request.Properties [HttpPropertyKeys.HttpRouteDataKey] = routeData;' – nemesv
Tak, działa już teraz! Tak się dzieje, gdy jesteś zmęczony ... Dzięki! –