Разрешить IOptions<T> в модульном тесте

У меня есть такой класс:

public class Test : ITest
{
    public Test(IOptions<CustomSection> settings)
    {
        //do something
    }
}

Я хотел бы провести модульное тестирование и просто поддерживать внедрение зависимостей. Поэтому для достижения этой цели я попытался сделать следующее:

var builder = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json", true, true)
    .AddEnvironmentVariables();

var configurationRoot = builder.Build();

//This is a method that injects various services.
var services = InjectServices();

services.AddSingleton<IConfiguration>(configurationRoot);
var provider = services.BuildServiceProvider();

var my service = provider.GetService<ITest>();

Однако я получаю следующую ошибку:

Не удалось разрешить тип сервопривода "Microsoft.Extensions.Options.IOptions`1[Test]" при попытке активировать "Test".

Как я могу добавить IOptions для инъекций? я думал так services.AddSingleton<IConfiguration>(configurationRoot); сделал бы трюк, но это не похоже. Кроме того, моя конфигурация верна, если я использую те же самые настройки приложений в своем основном проекте, проблем нет.

1 ответ

Решение

Вы забыли зарегистрировать услуги, необходимые для использования опций:

// extension method defined in Microsoft.Extensions.Options
services.AddOptions();

Кроме того, вы должны настроить, как построить CustomSection из конфигурации что-то вроде этого:

services.Configure<CustomSection>(configurationRoot);

Ссылочная конфигурация в ASP.NET Core

Шаблон параметров ссылок в ASP.NET Core

Другие вопросы по тегам