我已经在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
),但我无法在测试夹具中处理。< / p>
我在这里缺少什么?
答案 0 :(得分:4)
在MassTransit 4中,内存中的消息结构与RabbitMQ的行为相同。以前,内存中会将每条消息发布到每个端点,无论是否存在该消息类型的绑定。现在,如果没有绑定,则不会传递消息。
因此,您需要创建另一个接收端点,而不是使用SubscribeHandler<T>
,并使用Handled<T>
检查邮件是否已发布和接收。
或者,你可以在消费者测试工具上使用_consumer.Published.Select<T>.Any()
来查看它是否发布了该事件,而不是检查它是否被消费。