Подтвердить что ты не робот

Маршрутизация модульных тестов в 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());
4b9b3361

Ответ 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. Не пишите такие действия.