如何在MassTransit中与共享传输提供商一起使用内存传输



为了能够创建一些功能测试,我正在努力遵循本指南:

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

问题是InMemoryTransportCache类和SetTransportProvider方法都不能导入。我也找不到在github上的MassTransit来源中声明的它们。你是如何实现链接顶部所描述的内容的?

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

以下是如何使用测试工具测试应用程序: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();
}

并从线束中获得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);    
}

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

相关内容

最新更新