Как я могу закончить тестировать это. net ядро ​​консольного приложения? - PullRequest
0 голосов
/ 15 марта 2020

У меня есть консольное приложение. 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 (), некоторые из которых регистрируют обработчики сообщений для обработки speci c Типы сообщений от Azure Service Bus. Приложение должно выполнить некоторую инициализацию из InitialiseAppAsyn c (). Когда вызывается host.RunAsyn c (), консольное приложение запускается бесконечно, и обработчик сообщений получает выполнение, как только сообщение становится доступным на служебной шине Azure. Это все замечательно и отлично работает.

Я хотел бы создать новый проект под тем же решением, который содержит некоторые сквозные тесты (с использованием XUnit). Я хотел бы иметь возможность переопределить некоторые из зависимостей (с помощью тестовых макетов, используя NSubstitute), оставив другие зависимости, как они настроены в службе.

Я предполагаю, что мне нужно создать мой собственный HostBuilder в моем тесте, поэтому мне нужно будет иметь возможность настроить макеты до вызова host.RunAsyn c () в ходе теста.

Кто-нибудь знает, как я могу это сделать ? Или как лучше всего это делать?

В конечном счете, я пытаюсь переопределить некоторые (но не все) мои реальные зависимости в моем консольном приложении с помощью mocks, чтобы я мог проведите некоторые сквозные тесты.

Заранее спасибо

1 Ответ

0 голосов
/ 15 марта 2020

Есть несколько способов добиться этого. Вы можете настроить переменную окружения "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();
});
...