如何在 MassTransit 中使用共享传输提供程序进行内存传输?

How to use in memory transport with shared transport provider in MassTransit?

我正在尝试按照本指南进行操作,以便能够创建一些功能测试:

https://masstransittemp.readthedocs.io/en/latest/configuration/transports/in_memory.html

问题是 InMemoryTransportCache class 和 SetTransportProvider 方法都无法导入。我也找不到在 github 上的 MassTransit 资源中声明的它们。你如何实现上面 link 描述的内容?

如评论中所述,您正在阅读的文档无关紧要。

以下是使用测试工具测试应用程序的方法:https://masstransit-project.com/usage/testing.html

基本上,没有必要启动测试服务器,除非您想测试您的注册。完成所有测试是一项繁重的工作。

文档提供了一个测试消费者的简短示例,所以我只是将其复制粘贴到这里:

public async Task Should_test_the_consumer()
{
    var harness = new InMemoryTestHarness();
    var consumerHarness = harness.Consumer<MyConsumer>();

    await harness.Start();
    try
    {
        await harness.InputQueueSendEndpoint.Send(new MyMessage());

        // did the endpoint consume the message
        Assert.IsTrue(harness.Consumed.Select<MyMessage>().Any());

        // did the actual consumer consume the message
        Assert.IsTrue(consumerHarness.Consumed.Select<MyMessage>().Any());
    }
    finally
    {
        await harness.Stop();
    }
}

测试工具的测试项目也有很多很好的例子:https://github.com/MassTransit/MassTransit/tree/develop/src/MassTransit.Tests/Testing

如评论中所述 - 该文档已过时,但我的问题仍然有效。毕竟,我决定不采用建议的为消息代理设置 Docker 容器的方法,而是使用测试工具(上面也建议)。我正在使用 SpecFlow,所以一般代码是在 BeforeScenario 步骤中创建和启动线束,如下所示:

[BeforeScenario]
public async Task BeforeScenario() {
    _testHarness = new InMemoryTestHarness();

    await _testHarness.Start();
    TestStartup1.SetHarness(_testHarness);
    TestStartup2.SetHarness(_testHarness);

    // build WebHost and start both asp.net TestServer instances
}

[AfterScenario]
public async Task Cleanup() {
    await _testHarness.Stop();
}

并从 harness 中获取 IBusControl 实例,在两个测试启动中:

// test startup1
public override void UseMassTransit(IServiceCollection services) {
    services.AddMassTransit(_ => {
        // configure endpoints here, etc.

        return _testHarness.BusControl;
    }, RegisterConsumers);
}

// test startup2
public override void UseMassTransit(IServiceCollection services) {
    services.AddMassTransit(_ => {
        // configure endpoints here, etc.

        _testHarness.Bus.ConnectReceiveEndpoint("your-endpoint", ep => ep.ConfigureConsumers(serviceProvider));

        return _testHarness.BusControl;
    }, RegisterConsumers);    
}

我还没有看到如何使消息处理同步,这样我就不必等待结果,但无论如何上面的代码解决了我的问题。