我在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可以解析IBus
,IBusControl
和具体的消费者类,以及给定消息类型T
和IConsumer<T>
。
在我的测试中,如果我这样做:
await harness.InputQueueSendEndpoint.Send(new TestMessage());
harness.Consumed.Select<TestMessage>().Any().ShouldBeTrue();
然后首先测试在harness.Consumed
行上等待30秒,然后测试失败(Any()
返回false
)。如果我注册了一个消费者保护套,我会得到相同的行为-另外,我担心注册一个消费者保护套实际上并不能验证我的注册。
我是否对测试工具误解了?如何验证我的使用者配置正确? harness.Consume
行花费30秒是否表明我完全滥用了测试线束?这么多问题...
谢谢,
丹尼尔
测试工具创建自己的总线实例,Consumer,Saga等方法将其他工具添加到同一测试工具。如果在测试中要从容器中解析总线,则将无法使用该总线。线束中的一个对您毫无用处,该线束中的方法也无济于事。
您应该将对消费者的测试与对容器注册的测试分开。而且,在使用它时,为什么不使用内置的容器支持来配置端点等,而不是自己编写呢?我相信有一种从.AddMassTransit
到AddConsumersFromContainer
的扩展方法,您可以在其中指定容器。这使得它可以与先前加载的模块一起使用,这些模块将使用者添加到了容器中,而总线位于其自己的模块中。