Как создать экземпляр UrlHelper для модульного теста контроллера в Asp.Net Core 2.0 - PullRequest
0 голосов
/ 12 мая 2018

Я пишу юнит-тесты для моих контроллеров Asp.Net Core 2.0. Каждый контроллер внедряется с сервисом IUrlHelper для облегчения создания ссылок Hateoas. Эта служба зарегистрирована в методе ConfigureServices класса Startup. Вот снимок моего класса автозагрузки:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Infrastructure;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
        services.AddScoped<IUrlHelper, UrlHelper>(implementationFactory =>
        {
            var actionContext = 
                implementationFactory.GetService<IActionContextAccessor>()
                .ActionContext;
            return new UrlHelper(actionContext);
        });
    }
}

Контроллер образцов:

using Microsoft.AspNetCore.Mvc;

public class MyApiController : Controller
{
    private readonly IUrlHelper _urlHelper;

    public MyApiController(IUrlHelper urlHelper)
    {
        _urlHelper = urlHelper;
    }

    // At least 5 actions and each requires _urlHelper to create Hateoas links
}

Я застрял в том, что не знаю, как инициализировать класс UrlHelper внутри класса юнит-теста.

Что я пробовал до сих пор:


Пересмешник UrlHelper

Я нашел эту статью , но я предпочитаю , а не издеваться над сервисом UrlHelper и вместо этого инициализировать его для реального тестируемого API, потому что имитация требует слишком больших усилий, чтобы выписать все издевательские пути. Попытка протестировать весь мой API будет количество контроллеров * количество действий * количество ссылок на действие .

Запуск TestServer

Я нашел эту статью MS о создании TestServer. Однако это уже будет интеграционный тест, и я хотел бы придерживаться модульного тестирования как можно дольше. Если нет способа избежать запуска тестового сервера, с которым я сейчас играю, то я не знаю, как получить экземпляр UrlHelper с тестового сервера.


Есть ли какой-нибудь способ получить экземпляр UrlHelper для тестируемого API в моих тестовых классах, желательно без запуска тестового сервера, и, если тестовый сервер неизбежен, как мне получить экземпляр UrlHelper с тестового сервера?

1 Ответ

0 голосов
/ 04 марта 2019
  1. Вам не нужно вставлять UrlHelper в ваш конструктор. ControllerBase.Url уже содержит UrlHelper.
  2. Извлеките ваших разработчиков hateoas в отдельные классы, которые используют IUrlHelper, что снизит сложность ваших действий контроллера и упростит юнит-тестирование
  3. Создайте заглушку IUrlHelper для модульного тестирования ваших разработчиков шляп. Это довольно легко заглушить.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...