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