MassTransit SagaStateMachine测试不应该那么难,对吗?

问题描述

我正在尝试为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。