Регистрация обработчиков MediatR не удалась по запросам интеграционных тестов - PullRequest
0 голосов
/ 30 марта 2020

Я бы хотел провести интеграционные тесты на одном из моих микросервисов с помощью TestServer. Я использую контейнер Io C по умолчанию для регистрации зависимостей. Мой запуск - это копия запуска микросервиса без служб проверки работоспособности базы данных, et c. Для регистрации обработчиков MediatR я использую:

var assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(
                x => x.FullName.Contains($"test.{type.ToString()}") || x.FullName.Contains($"test.Common")).ToArray();

services.AddMediatR(assemblies.GetAssemblies);

Кроме того, мой класс AppTestFixture выглядит следующим образом:

public class AppTestFixture : WebApplicationFactory<TestStartup>
{
    protected override IHostBuilder CreateHostBuilder()
    {
        var builder = Host.CreateDefaultBuilder()
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<TestStartup>()
                    .UseTestServer();
            });

        return builder;
    }
}

К сожалению, этот фрагмент кода отлично работает на реальном производстве, это означает, что обработчики MediatR зарегистрированы правильно, но если я выполняю интеграционные тесты, то выдается исключение «обработчики регистров не найдены». Почему обработчики правильно прописаны в реальной среде, а на тесте нет? Как зарегистрировать обработчики MediatR в тестовой среде?

1 Ответ

0 голосов
/ 04 апреля 2020

Эта часть

var assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(
                x => x.FullName.Contains($"test.{type.ToString()}") || x.FullName.Contains($"test.Common")).ToArray();

Запустите один отдельный тест в режиме отладки или передайте содержимое:

 AppDomain.CurrentDomain.GetAssemblies() 

И я бы предположил, что ни одно из предложений where не подходит при выполнении интеграционных тестов, но это трудно сказать без дополнительной информации. Посмотрите, что выводится, когда вы запустите тест, это будет ключ.

Так что

services.AddMediatR(assemblies.GetAssemblies);

Не регистрирует ваши обработчики, так как результат равен нулю / пуст.

Если это не создает проблемы, вы можете попытаться зарегистрировать минимум обработчиков вручную. Затем вы можете увидеть, является ли процесс регистрации причиной проблемы или нет. Поэтому вручную зарегистрируйтесь так:

services.AddScoped(typeof(ISomeType), typeof(SomeType));

или

services.AddScoped<ISomeType, SomeType>();

Если вы сделаете это, вы, по крайней мере, удалите все элементы отражения из GetAssemblies () из процесса. Я всегда пробовал бы изолировать один тест и отлаживать его.

Надеюсь, это поможет

...