【问题标题】:Testing MassTransit endpoint configuration in Autofac module在 Autofac 模块中测试 MassTransit 端点配置
【发布时间】:2020-04-02 02:09:49
【问题描述】:

我在 Autofac 模块中有一些端点配置代码,它根据我想要进行单元测试的约定注册消费者。我不想验证任何消费者的任何行为,我只想检查我的设置代码是否在做我需要做的事情。我正在使用InMemoryTestHarness,但消费似乎不起作用,我不确定配置总线和注册消费者测试工具之间的相关性。

为了允许主机在 Rabbit for prod 和内存中进行测试之间交换,我在我的模块中有这个:

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

我在单元测试中验证 Autofac 可以解析 IBusIBusControl 和具体的消费者类,以及给定消息类型 TIConsumer&lt;T&gt;

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

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

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

然后首先测试在harness.Consumed 行等待 30 秒然后测试失败(Any() 返回false)。如果我注册消费者安全带,我会得到相同的行为 - 而且我担心注册消费者安全带实际上并不能验证我的注册。

我对测试工具有什么误解吗?我将如何验证我的消费者配置是否正确? harness.Consume 行需要 30 秒是否表明我完全滥用了测试工具?这么多问题...

谢谢,

丹尼尔


编辑

根据 Chris Patterson 的评论,我更新了我的注册以使用 MassTransit Autofac 集成方法(上面更新了代码),但仍然遇到同样的问题。

【问题讨论】:

    标签: masstransit


    【解决方案1】:

    测试工具创建自己的总线实例,Consumer、Saga 等方法将额外的工具添加到同一个测试工具。如果您在测试中从容器中解析总线,那么您将无法使用该总线。线束中的那个对你没有用,就像那个线束中的方法一样。

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

    【讨论】:

    • 在我的测试中,测试工具创建的总线是从为测试创建的容器返回的总线(我已经验证它们是同一个对象)。我不是在尝试测试容器注册或消费者实际做了什么——我是在尝试测试消费者是否附加到我为他们指定的队列(即 MassTransit 配置)。我已经改用 .AddMassTransit.ConfigureConsumer 但它仍然表现出相同的行为。
    • 标记为已接受的答案,因为它让我更多地考虑我的注册。事实证明,问题是我需要使用await harness.BusControl.Publish(new TestMessage()),然后一切正常。这是有道理的,因为这可以确保一切都通过同一总线进行协调。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 2023-01-14
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多