问题描述
我正在尝试为Masstransit SagaStateMachine编写单元测试。
SagaStateMachine有一些与之关联的活动,因此我必须编写一个服务提供者并在配置接收端点时将其添加。
我的问题是,当我尝试将ISagaRepository解析为InMemorySagaRepository时,它返回null,因此,我无法确认模拟中的实际工作。
有没有更简单的方法可以做到这一点?我无能为力。
这些活动包括一个不和谐的套接字客户端,我已经将其嘲笑并注入到服务提供者中,您可以在此处查看我的源代码: https://github.com/robertkirkham88/NightFuryBot/blob/master/tests/NFB.UI.DiscordBot.Tests/StateMachines/FlightStateMachineTests.cs
第146行是问题所在,但我在设置总线时可能做错了什么。 Masstransit和Automatonymous上的单元测试没有帮助,我在git / stackoverflow上找不到其他解决方案。
var repo = this.provider.GetService<ISagaRepository<FlightState>>() as InMemorySagaRepository<FlightState>;
Assert.NotNull(repo);
解决方法
我遇到了类似的问题。我想通过 DI 解决活动来测试状态机 sage。我已经尝试过 [@Chris Patterson] (https://stackoverflow.com/a/63999346/14864310) 提供的带有 AddMassTransitInMemoryTestHarness
方法的解决方案,但看起来 harness
不会消耗我发送给传奇的消息。在线束启动之前添加以下代码后,它就开始工作了:
harness.OnConfigureInMemoryReceiveEndpoint += cfg =>
{
cfg.ConfigureSagas(provider.GetRequiredService<IBusRegistrationContext>());
}
await harness.Start();
我不确定这是有意为之还是我遗漏了一些东西。
, MassTransit的7.0.4版包含InMemoryTestHarness
的基于容器的配置,因此在使用容器时更易于配置测试。
Release Notes的封面用法,如下所示。
根据您链接的代码,您需要:
services.AddMassTransitInMemoryTestHarness(cfg =>
{
cfg.AddSagaStateMachine<FlightStateMachine,FlightState>()
.InMemoryRepository();
cfg.AddSagaTestHarness<FlightState>();
});
然后,一旦构建容器,您就可以解析测试工具并启动它。
var harness = provider.GetRequiredService<InMemoryTestHarness>();
await harness.Start();
应该已经在端点上配置了状态机,因此您的Publish
调用应该将事件传递到状态机。
此外,您只需要
ISagaRepository<T>
来检查是否存在sagas。