У меня есть некоторый код конфигурации конечной точки в модуле 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 (код обновлен выше), но все еще получаю ту же проблему.