如何在 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);
}
我还没有看到如何使消息处理同步,这样我就不必等待结果,但无论如何上面的代码解决了我的问题。
我正在尝试按照本指南进行操作,以便能够创建一些功能测试:
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);
}
我还没有看到如何使消息处理同步,这样我就不必等待结果,但无论如何上面的代码解决了我的问题。