.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;
}
iはユニットテストをデバッグ:ヘルプ機能付き
[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
これは今動作します!それはあなたが疲れているときに起こることです。ありがとう! –