【问题标题】:How do i wireup NServiceBus' SqlSaga in a test scenario?我如何在测试场景中连接 NServiceBus 的 SqlSaga?
【发布时间】:2018-06-15 11:11:14
【问题描述】:

https://docs.particular.net/nservicebus/testing/ 有一个非常简洁的示例来说明如何测试一个简单的 Saga。不幸的是,它没有解释如何对 SqlSaga 做同样的事情 - 即。一个将状态持久化到数据库的 Saga。

鉴于这个传奇:

public class SomeFancySaga : SqlSaga<MySagaData>,
    IAmStartedByMessages<ImportantCommand>
{
    protected override string CorrelationPropertyName => nameof(Data.MyPrimaryKey);

    protected override void ConfigureMapping(IMessagePropertyMapper mapper)
    {
        mapper.ConfigureMapping<ImportantCommand>(x => x.CommandId);
    }

    public async Task Handle(ImportantCommand command, IMessageHandlerContext context)
    {
        if (Data.State == MyState.ReadyForUse)
            <do some stuff>
    }
    ...
}

如果我尝试像链接中的示例那样编写测试代码,我会这样做:

// arrange
var context = new NServiceBus.Testing.TestableMessageHandlerContext();
var command = ImportantCommand.Create();
var sut = new CreateSomeFancySaga();

// act
sut.Handle(command, context);

// assert
...

对 sut.Handle() 的调用将抛出 NullReferenceException,因为 Saga 属性 Data 尚未初始化

我如何正确连接 saga 以进行测试,以便:

  1. 数据已初始化
  2. 真正需要真正的数据库连接

【问题讨论】:

  • 问题 1 可以通过将 SUT 初始化为 var sut = new CreateSomeFancySaga() { Data = new MySagaData() } 来解决 - 但我不确定它是否有助于解决问题2.
  • 问题 2 实际上没有实际意义,因为 Handle 方法是独立测试的。这意味着没有任何东西调用持久化逻辑。

标签: testing nservicebus nservicebus-sagas


【解决方案1】:

我们有一个相关的代码示例更详细地显示了单元测试:https://docs.particular.net/samples/unit-testing/。这包括几个针对 saga 的测试 (SagaTests.cs)。

您可以以此为起点,通过以下方式修改 saga 测试:

  1. 添加NServiceBus.Persistence.Sql包。
  2. 修改 DiscountPolicy 策略传奇以从 SqlSaga 继承而不是 Saga
  3. 解决编译错误(添加缺少的方法和属性,您可以将它们保留为空,并删除ConfigureHowToFindSaga 方法)。

我希望这会有所帮助,但如果有任何遗漏或您的场景无法通过这种方式进行测试,请告诉我。

【讨论】:

  • 这也是我得到的解决方案,正如对我的 OP 的评论中所述。我认为我太专注于这样一个事实,即我正在测试具有内置 SQL 持久性的东西,而实际上我没有:我只是在测试完全隔离的 Handle() 方法。所以它是 SqlSaga 并不重要——除了需要添加 NServiceBus.Persistence.Sql 包。也许您可以将那条信息添加到您的文档中 - 这将非常有用。
猜你喜欢
  • 2018-11-28
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多