簡體   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