ASP.NET Core XUnit 用参数 (DI) 替换服务

ASP.NET Core XUnit replace service with parameter (DI)

我是 XUnit 的新手,我正在尝试使用新的应用程序设置和服务来配置我的测试项目。 该服务在构造函数中接受 appsettings class。

在我的 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 时,在服务中使用来自 AppSettings 的数据时出现 NullExceptions。 (评论中的两行都不起作用)

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)))
            );

有人能指出我正确的方向吗?

试试 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)
);