Я пишу юнит-тесты для моих контроллеров 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 с тестового сервера?