在Autofac模块中测试MassTransit端点配置

问题描述 投票:0回答:1

我在Autofac模块中有一些终结点配置代码,该模块根据我要进行单元测试的约定来注册使用者。我并不是要验证任何使用者的任何行为,我只想检查我的设置代码是否在执行我需要做的事情。我正在使用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.Register(ctx => BusFactory(cfg => 
{
   foreach(var queueDef in queueDefs)
      cfg.ReceiveEndpoint(queueDef.QueueName, e => 
      {
         var context = ctx.Resolve<IComponentContext>();
         foreach(var consumerDef in queueDef.ConsumerDefs)
            e.Consumer(consumerDef.ConsumerType, t => context.Resolve(t));
      });
})
.AsSelf() // IBusControl
.As<IBus>()
.SingleInstance();

对于单元测试设置,我正在做:

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>();

我已经在单元测试中验证了Autofac可以解析IBusIBusControl和具体的消费者类,以及给定消息类型TIConsumer<T>

在我的测试中,如果我这样做:

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

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

然后首先测试在harness.Consumed行上等待30秒,然后测试失败(Any()返回false)。如果我注册了一个消费者保护套,我会得到相同的行为-另外,我担心注册一个消费者保护套实际上并不能验证我的注册。

我是否对测试工具误解了?如何验证我的使用者配置正确? harness.Consume行花费30秒是否表明我完全滥用了测试线束?这么多问题...

谢谢,

丹尼尔

masstransit
1个回答
0
投票

测试工具创建自己的总线实例,Consumer,Saga等方法将其他工具添加到同一测试工具。如果在测试中要从容器中解析总线,则将无法使用该总线。线束中的一个对您毫无用处,该线束中的方法也无济于事。

您应该将对消费者的测试与对容器注册的测试分开。而且,在使用它时,为什么不使用内置的容器支持来配置端点等,而不是自己编写呢?我相信有一种从.AddMassTransitAddConsumersFromContainer的扩展方法,您可以在其中指定容器。这使得它可以与先前加载的模块一起使用,这些模块将使用者添加到了容器中,而总线位于其自己的模块中。

© www.soinside.com 2019 - 2024. All rights reserved.