MassTransit 4 单元测试消费者超时
MassTransit 4 Unit Test Consumer timeout
我已经在 MT 3.5.7 中成功地将此测试模式与 sagas 一起使用,但现在在 MT 4.0 中测试消费者时,我正在使用 InMemoryTestHarness
来测试来自消费者的消息的发布。
通过测试调试单步执行我可以看到消费者被正确调用并发布了消息。消费者除了接收消息和发布新消息外什么都不做。
但是等待已发布消息的 _harness.SubscribeHandler
超时。
为了简洁起见,下面的代码删除了我的容器注册和测试数据设置。
[TestFixture]
public class ConsumerTest
{
InMemoryTestHarness _harness;
ConsumerTestHarness<TCommandConsumer> _consumer
ConsumeContext<ConsumerCompleted> _resultHandler;
[OneTimeSetup]
public async Task TaskSetup()
{
IContainer _container;
//...container registrations and test data setup
_harness = new InMemoryTestHarnes();
_consumer = _harness.Consumer<TCommandConsumer>( () => _container.Resolve<TCommandConsumer>() );
await _harness.Start();
await _harness.InputQueueSendEndpoint.Send(new TCommand { Source = testdataSource, Topic = testdataTopic });
_resultHandler = await _harness.SubscribeHandler<ConsumerCompleted>(); //Timeout here
}
命令使用者 (TCommandConsumer
) 成功接收到从 InputQueueSendEndpoint.Send
发送的命令并发布其响应 (ConsumerCompleted
) 但我无法在测试夹具中处理该命令.
我在这里错过了什么?
在 MassTransit 4 中,内存消息结构的行为与 RabbitMQ 相同。以前,内存中会将每条消息发布到每个端点,无论是否存在该消息类型的绑定。现在,如果没有绑定,则不会传递消息。
因此您需要创建另一个接收端点而不是使用 SubscribeHandler<T>
,并使用 Handled<T>
检查消息是否已发布和接收。
或者,您可以只使用消费者测试工具上的 _consumer.Published.Select<T>.Any()
查看它是否发布了事件,而不是检查它是否被消费。
我已经在 MT 3.5.7 中成功地将此测试模式与 sagas 一起使用,但现在在 MT 4.0 中测试消费者时,我正在使用 InMemoryTestHarness
来测试来自消费者的消息的发布。
通过测试调试单步执行我可以看到消费者被正确调用并发布了消息。消费者除了接收消息和发布新消息外什么都不做。
但是等待已发布消息的 _harness.SubscribeHandler
超时。
为了简洁起见,下面的代码删除了我的容器注册和测试数据设置。
[TestFixture]
public class ConsumerTest
{
InMemoryTestHarness _harness;
ConsumerTestHarness<TCommandConsumer> _consumer
ConsumeContext<ConsumerCompleted> _resultHandler;
[OneTimeSetup]
public async Task TaskSetup()
{
IContainer _container;
//...container registrations and test data setup
_harness = new InMemoryTestHarnes();
_consumer = _harness.Consumer<TCommandConsumer>( () => _container.Resolve<TCommandConsumer>() );
await _harness.Start();
await _harness.InputQueueSendEndpoint.Send(new TCommand { Source = testdataSource, Topic = testdataTopic });
_resultHandler = await _harness.SubscribeHandler<ConsumerCompleted>(); //Timeout here
}
命令使用者 (TCommandConsumer
) 成功接收到从 InputQueueSendEndpoint.Send
发送的命令并发布其响应 (ConsumerCompleted
) 但我无法在测试夹具中处理该命令.
我在这里错过了什么?
在 MassTransit 4 中,内存消息结构的行为与 RabbitMQ 相同。以前,内存中会将每条消息发布到每个端点,无论是否存在该消息类型的绑定。现在,如果没有绑定,则不会传递消息。
因此您需要创建另一个接收端点而不是使用 SubscribeHandler<T>
,并使用 Handled<T>
检查消息是否已发布和接收。
或者,您可以只使用消费者测试工具上的 _consumer.Published.Select<T>.Any()
查看它是否发布了事件,而不是检查它是否被消费。