我有一个相当简单的示例,想要对没有响应的端点进行单元测试。我已经看过使用它的示例,并且它按预期工作。
var harness = new InMemoryTestHarness();
harness.Consumer<FooBarConsumer>();
await harness.Start();
await harness.InputQueueSendEndpoint.Send<FooCommand>(new FooCommand());
Assert.IsTrue(await harness.Consumed.Any<FooCommand>());
但是,我想使用 ServiceProvider 来执行此操作,以便我可以设置和模拟依赖项。这就是我目前所拥有的
await using var provider = new ServiceCollection()
.AddMassTransitTestHarness(cfg =>
{
cfg.UsingInMemory((ctx, mem) =>
{
mem.ConfigureEndpoints(ctx);
});
cfg.AddConsumer<FooBarConsumer>();
})
.BuildServiceProvider(true);
如果我尝试执行以下操作,则会收到一条错误消息,指出尚未注册。
var harness = provider.GetRequiredService<InMemoryTestHarness>();
示例指出要这样做
var harness = provider.GetRequiredService<ITestHarness>();
但是通过这样做我无法访问
InputQueueSendEndpoint
。它迫使我沿着请求和响应的路线走下去,但该端点没有输出。
var client = harness.GetRequestClient<FooCommand>();
await client.GetResponse<FooBar>(new FooCommand());
我想问题是,是否可以使用
InMemoryTestHarness
测试仅接收命令但没有输出的消费者,但也设置其依赖项?
testing文档展示了如何配置和启动测试工具。如果您只是测试消费者而没有响应,只需使用
harness.Bus.Publish()
。
如果您坚持使用
Send
,请拨打harness.GetConsumerEndpoint<T>
,然后再拨打Send
即可。
此外,使用模拟/等。对于单元测试消费者来说,直接调用
Consume
是一种非常糟糕的方法。我强烈反对它(@AndyG)。