【发布时间】: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 可以解析 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 秒是否表明我完全滥用了测试工具?这么多问题...
谢谢,
丹尼尔
编辑
根据 Chris Patterson 的评论,我更新了我的注册以使用 MassTransit Autofac 集成方法(上面更新了代码),但仍然遇到同样的问题。
【问题讨论】:
标签: masstransit