我有一个 .Net Core 2.0 控制台应用程序。 main()方法是这样的:
public static async Task Main()
{
// create host builder
var hostBuilder = new HostBuilder();
var myApp = new MyApplication();
// Build host
var host = hostBuilder
.ConfigureHostConfiguration(myApp.ConfigureHostConfiguration)
.ConfigureServices(myApp.ConfigureServices)
.ConfigureLogging(myApp.ConfigureLogging)
.Build();
// Initialise
await myApp.InitialiseAppAsync(host);
// Run host
await host.RunAsync(CancellationToken.None);
}
MyApplication 类在ConfigureHostConfiguration() 中设置应用程序配置,然后在ConfigureServices() 中配置依赖项,其中一些依赖项注册消息处理程序以处理来自Azure 服务总线的特定消息类型。应用程序需要在 InitialiseAppAsync() 中进行一些初始化。调用 host.RunAsync() 时,控制台应用程序将无限期运行,并且一旦 Azure 服务总线上有消息可用,消息处理程序就会接收执行。这一切都很棒并且工作正常。
我想做的是在同一解决方案下创建一个新项目,其中包含一些端到端测试(使用 XUnit)。我希望能够覆盖一些依赖项(使用测试模拟,使用 NSubstitute),保留其他依赖项,因为它们在服务中配置。
我猜我需要在测试中创建自己的 HostBuilder,因此我需要能够在测试中进行 host.RunAsync() 调用之前设置模拟。
有谁知道我该怎么做?或者这样做的最佳实践是什么?
最终,我想做的是能够使用模拟覆盖控制台应用程序中的一些(但不是全部)真正依赖项,这样我就可以进行一些端到端测试。
提前致谢
有多种方法可以实现这一目标。您可以在启动应用程序时设置环境变量“environment”。然后你需要运行你的应用程序,像这样传递它:
dotnet "MyApplication.dll" --environment end2endTests
然后你将能够找到你作为环境传递的值IHostEnvironment
可注入的实例。您的 DI 注册如下所示:
services.AddScoped<IFoo>(provider =>
{
var env = provider.GetRequiredService<IHostEnvironment>();
if (env.EnvironmentName == "end2endTests")
{
return new TestFoo();
}
return new RealFoo();
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)