繁体   English   中英

我怎样才能端到端地测试这个 .net 核心控制台应用程序?

[英]How can I end to end test this .net core console application?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM