C# 如何对这个.net核心控制台应用程序进行端到端测试?
我有一个.NETCore2.0控制台应用程序。main()方法如下所示:C# 如何对这个.net核心控制台应用程序进行端到端测试?,c#,.net-core,console-application,xunit,nsubstitute,C#,.net Core,Console Application,Xunit,Nsubstitute,我有一个.NETCore2.0控制台应用程序。main()方法如下所示: public static async Task Main() { // create host builder var hostBuilder = new HostBuilder(); var myApp = new MyApplication(); // Build host var host = hostBuilder .ConfigureHostConfi
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);
}
dotnet "MyApplication.dll" --environment end2endTests
MyApplication类在ConfigureHostConfiguration()中设置应用程序配置,然后在ConfigureServices()中配置依赖项,其中一些依赖项注册消息处理程序以处理来自Azure服务总线的特定消息类型。应用程序需要从InitialiseAppAsync()内进行一些初始化。调用host.RunAsync()时,控制台应用程序将无限期运行,并且消息处理程序将在Azure服务总线上有消息可用时立即接收执行。这一切都很好,运行良好
我想做的是在相同的解决方案下创建一个新项目,该解决方案包含一些端到端测试(使用XUnit)。我希望能够覆盖一些依赖项(使用测试模拟,使用NSubstitute),将其他依赖项保留为在服务中配置的依赖项
我猜我需要在测试中创建自己的HostBuilder,因此我需要能够在测试中进行host.RunAsync()调用之前设置模拟
有人知道我怎么做吗?或者这样做的最佳实践是什么
最终,我要做的是能够用mock覆盖控制台应用程序中的一些(但不是全部)真正的依赖项,这样我就可以进行一些端到端测试
提前感谢实现这一点有多种方法。您可以在启动应用程序时设置环境变量“environment”。然后,您需要按如下方式运行应用程序:
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);
}
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();
});
services.AddScoped(提供者=>
{
var env=provider.GetRequiredService();
如果(env.EnvironmentName==“end2endTests”)
{
返回新的TestFoo();
}
返回新的RealFoo();
});