MassTransit 单元测试端点没有响应

问题描述 投票:0回答:1

我有一个相当简单的示例,想要对没有响应的端点进行单元测试。我已经看过使用它的示例,并且它按预期工作。

        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
测试仅接收命令但没有输出的消费者,但也设置其依赖项?

c# masstransit
1个回答
0
投票

testing文档展示了如何配置和启动测试工具。如果您只是测试消费者而没有响应,只需使用

harness.Bus.Publish()

如果您坚持使用

Send
,请拨打
harness.GetConsumerEndpoint<T>
,然后再拨打
Send
即可。

此外,使用模拟/等。对于单元测试消费者来说,直接调用

Consume
是一种非常糟糕的方法。我强烈反对它(@AndyG)。

© www.soinside.com 2019 - 2024. All rights reserved.