ASP. NET Core XUnit заменяет службу параметром (DI) - PullRequest
0 голосов
/ 14 апреля 2020

Я новичок в XUnit и пытаюсь настроить свой тестовый проект с новыми настройками приложений и сервисом. Служба принимает класс appsettings в конструкторе.

В моем файле запуска из моего проекта API у меня есть следующее:

services.Configure<AppSettings>(_configuration.GetSection("AppSettings"));
var appSettings = _configuration.GetSection(nameof(AppSettings)).Get<AppSettings>();

services.AddScoped<ILogging, MailLogging>(s => new MailLogging(appSettings));           

Это работает для моего API, но теперь я хочу использовать его в своем проекте XUnit (но с другим файл appsettings)

var appsettings = new ConfigurationBuilder()
                 .SetBasePath(Directory.GetCurrentDirectory())
                 .AddJsonFile("appsettings.json")
                 .Build()
                 .GetSection("AppSettings");

builder.ConfigureTestServices(services =>
    services.Configure<AppSettings>(appsettings)
);

Это работает, но когда я пытаюсь реализовать новый MailLogging, я получаю исключения NullException при использовании данных из AppSettings в сервисе. (обе строки в комментарии не работают)

builder.ConfigureTestServices(services =>
                //services.AddScoped<ILogging, MailLogging>(s => new MailLogging(appsettings as AppSettings))
                //services.Replace(ServiceDescriptor.Scoped<ILogging, MailLogging>(s => new MailLogging(appsettings as AppSettings)))
            );

Может ли кто-нибудь указать мне правильное направление?

1 Ответ

1 голос
/ 14 апреля 2020

Попробуйте Bind метод вместо:

var appsettingsSection = new ConfigurationBuilder()
                 .SetBasePath(Directory.GetCurrentDirectory())
                 .AddJsonFile("appsettings.json")
                 .Build()
                 .GetSection("AppSettings");

var appSettings = new AppSettings();
appsettingsSection.Bind(appSettings);

builder.ConfigureTestServices(services =>
    services.AddSingleton(appSettings);
    services.AddScoped<ILogging, MailLogging>(s => new MailLogging(appsettings)
);
...