Маршрутизация модульных тестов в ASP.NET Core 1.0 (ex MVC 6)
Поскольку архитектура ASP.NET Core 1.0 (ex MVC 6/ASP.NET 5.0) значительно изменилась, как можно было бы выполнить модульное тестирование маршрутизации?
В качестве примера мне нравятся библиотеки, такие как этот (как для <= MVC 5): https://github.com/AnthonySteele/MvcRouteTester
Что-то вниз по линиям быстрых методов расширения:
routes.ShouldMap("/").To<HomeController>(x => x.Index());
Ответы
Ответ 1
Хорошо... Я сделал ping команду ASP.NET и спросил их, как они приступили к выполнению своих тестов.
Короткий ответ
Вы не можете unit test не издеваться над миром. Вы должны выполнить интеграционные/функциональные тесты.
Слегка длинный ответ
Маршрутизация может поступать из многих мест (атрибуты, заранее определенные маршруты, области и т.д.) и может быть даже изменена промежуточным программным обеспечением. Включение всех этих сценариев в тест потребует установки некоторого массивного дерева зависимостей, тогда как есть более простой способ его протестировать.
Как они это делают.
В основном, они создают TestStartup.cs
, самостоятельно размещая приложение в процессе тестирования и попадая в себя, чтобы увидеть, как он себя ведет. Они переопределяют результаты и... это в значительной степени.
Я думаю, что предоставил вам все возможные инструменты, чтобы на самом деле загружать что-то для себя.
Ответ 2
На самом деле не совсем сложно написать собственную структуру тестирования маршрутов. Я реализовал тестирование маршрутов в MyTested.AspNetCore.Mvc, и он работает быстро и без проблем - https://github.com/ivaylokenov/MyTested.AspNetCore.Mvc
Вы можете взглянуть на код, но в основном, вам нужно следующее:
- Вызванный IApplicationBuilder для извлечения зарегистрированных маршрутов из
- Пользовательский HTTP RouteFeature для передачи RouteData вокруг
- Custom ControllerActionInvoker для извлечения привязанных моделей и остановки MVC от обработки действия
- Тестовые сборщики и синтаксические анализаторы для собственно подготовки и выполнения теста
С учетом этих шагов даже тесты, такие как следующие, работают правильно:
// action
public class NormalController : Controller
{
[HttpPost]
public IActionResult UltimateModelBinding(
ModelBindingModel model,
[FromServices]IUrlHelperFactory urlHelper)
{
return null;
}
}
// model
public class ModelBindingModel
{
[FromBody]
public RequestModel Body { get; set; }
[FromForm(Name = "MyField")]
public string Form { get; set; }
[FromQuery(Name = "MyQuery")]
public string Query { get; set; }
[FromRoute(Name = "id")]
public int Route { get; set; }
[FromHeader(Name = "MyHeader")]
public string Header { get; set; }
}
// unit test
MyMvc
.Routes()
.ShouldMap(request => request
.WithLocation("/Normal/UltimateModelBinding/100?myQuery=Test")
.WithMethod(HttpMethod.Post)
.WithJsonBody(new
{
Integer = 1,
String = "MyBodyValue"
})
.WithFormField("MyField", "MyFieldValue")
.WithHeader("MyHeader", "MyHeaderValue"))
.To<NormalController>(c => c.UltimateModelBinding(
new ModelBindingModel
{
Body = new RequestModel { Integer = 1, String = "MyBodyValue" },
Form = "MyFieldValue",
Route = 100,
Query = "Test",
Header = "MyHeaderValue"
},
From.Services<IUrlHelperFactory>()));
Р. S. Не пишите такие действия.