Тестирование конфигурации конечной точки MassTransit в модуле Autofa c - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть некоторый код конфигурации конечной точки в модуле Autofa c, который регистрирует потребителей на основе соглашений, которые я хотел бы провести модульным тестированием. Я не пытаюсь проверить какое-либо поведение потребителей, я просто хочу убедиться, что мой установочный код делает то, что мне нужно. Я использую InMemoryTestHarness, но потребление, похоже, не работает, и я не уверен в корреляции между настройкой шины и регистрацией пользовательских тестовых проводов.

Чтобы разрешить переключение хоста между Rabbit для прод и в памяти для тестов у меня есть это в моем модуле:

Func<Action<IReceiveConfigurator>, IBusControl> BusFactory = receiveConfig => Bus.Factory.CreateUsingRabbitMq(cfg => 
{
   cfg.Host(rabbitMqUrl, hostCfg => 
  { 
    hostCfg.Username(rabbitMqUsername); 
    hostCfg.Password(rabbitMqPassword);
  });

  receiveConfig(cfg);
});

Для фактической регистрации потребителя в моем модуле у меня есть:

// code to scan assembly and build a list of queue definitions with consumers
...
// consumer registration
builder.AddMassTransit(x =>
{
   foreach(var consumerType in consumerTypes)
      x.AddConsumer(consumerType);

   x.AddBus(context => BusFactory(cfg => 
   {
      foreach(var queueDef in queueDefs)
         cfg.ReceiveEndpoint(queueDef.QueueName, e => 
         {
            foreach(var consumerDef in queueDef.ConsumerDefs)
               e.ConfigureConsumer(context, consumerDef.ConsumerType);
         });
   });
});

Для настройки модульного теста я делая:

harness = new InMemoryTestHarness();

var module = new MassTransitModule(typeof(TestMessageConsumer).Assembly)
{
   BusFactory = (receiveConfig) =>
   {
      harness.OnConfigureBus += cfg => receiveConfig(cfg);
      Task.WaitAll(harness.Start());
      return harness.BusControl;
   }
};

var builder = new ContainerBuilder();
builder.RegisterModule(module);
container = builder.Build();
// ensure bus initialisation runs
container.Resolve<IBusControl>();

В модульном тесте я проверил, что Autofa c может разрешать IBus, IBusControl и конкретные потребительские классы, а также, учитывая тип сообщения T an IConsumer<T>.

В моих тестах, если я делаю:

await harness.InputQueueSendEndpoint.Send(new TestMessage());

harness.Consumed.Select<TestMessage>().Any().ShouldBeTrue();

, то сначала тест ждет в строке harness.Consumed в течение 30 секунд, затем тест не пройден (Any() возвращает false). Я получаю такое же поведение, если я регистрирую жгут для потребителей - плюс я боюсь, что регистрация жгута для потребителей на самом деле не подтверждает мою регистрацию.

Неужели я что-то не так понял с помощью тестового жгута? Как мне проверить правильность конфигурации моего потребителя? Линия harness.Consume, занимающая 30 секунд, указывает на то, что я полностью использовал тестовый жгут? Так много вопросов ...

Спасибо,

Даниэль


РЕДАКТИРОВАТЬ

Основано на комментарии Криса Паттерсона Я обновил свою регистрацию, чтобы использовать методы интеграции MassTransit Autofa c (код обновлен выше), но все еще получаю ту же проблему.

1 Ответ

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

Тестовый жгут создает свой собственный экземпляр шины, а Consumer, Saga, et c. методы добавляют дополнительные жгуты к тому же испытательному ремню Если вы решаете использовать шину из контейнера как часть теста, вы застряли на этой шине. Тот, что в жгуте, бесполезен для вас, так же как и методы в жгуте.

Вы должны отделить тестирование ваших потребителей от тестирования регистрации контейнера. И пока вы занимаетесь этим, почему бы не использовать встроенную поддержку контейнеров для настройки конечных точек и т. Д. c. вместо того, чтобы писать это самостоятельно? Я считаю, что есть метод расширения для .AddMassTransit до AddConsumersFromContainer, где вы указываете контейнер. Это делает его пригодным для использования с ранее загруженными модулями, которые добавили потребителей в контейнер, где шина находится в собственном модуле.

...