【发布时间】:2020-06-23 14:40:34
【问题描述】:
我采用了一个遗留的 .NET 框架应用程序,它只包含类库和一个单元测试项目,并将它们全部转换为 .NET core 3.1。
我似乎无法使用使用IHostBuilder 的CreateHostBuilder 的.NET 核心方法执行或引导单元测试。
当我调试我的任何单元测试时,它会停止执行并出现以下错误:
以下构造函数参数没有匹配的夹具数据:IOptions`1 appConfig、IServiceX serviceX、ITemplateEngine templateEngine 异常没有堆栈跟踪
示例单元测试:
public class TemplateGenerationTests : BaseTest
{
private readonly AppConfiguration appConfig;
private readonly IServiceX serviceX;
private readonly ITemplateEngine templateEngine;
public TemplateGenerationTests(IOptions<AppConfiguration> appConfig, IServiceX serviceX, ITemplateEngine templateEngine)
{
this.appConfig = appConfig.Value;
this.serviceX = serviceX;
this.templateEngine = templateEngine;
}
[Fact]
public void SomeTestIhave()
{
//removed for brevity
serviceX.DoWork(appConfig.SomeAppProp);
Assert.NotNull(result);
Assert.NotEmpty(result);
}
}
基类(我感觉这是创建 hostbuiler 的错误方式):
public class BaseTest
{
public BaseTest()
{
var builder = CreateHostBuilder();
Task.Run(() => builder.RunConsoleAsync());
}
public static IHostBuilder CreateHostBuilder(string[] args = null) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddJsonFile("appsettings.json", optional: true);
config.AddEnvironmentVariables();
if (args != null)
{
config.AddCommandLine(args);
}
})
.ConfigureServices((hostContext, services) =>
{
services.AddOptions();
services.Configure<AppConfiguration>(hostContext.Configuration.GetSection("AppConfiguration"));
services.AddTransient<IServiceX, ServiceX>();
services.AddTransient<ITemplateEngine, TemplateEngine>();
//removed for brevity..
})
.ConfigureLogging((hostingContext, logging) =>
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
});
}
理想情况下,我正在寻找一个可以设置 HostBuilder 的点,即在控制台或 API .NET 项目中,这将在 Program 类的 Main 方法中。
【问题讨论】: