C# 如何对这个.net核心控制台应用程序进行端到端测试?

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

我有一个.NETCore2.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);
}
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();
});