如何在测试场景中连接NServiceBus的SqlSaga?

时间:2018-06-15 11:11:14

标签: testing nservicebus nservicebus-sagas

https://docs.particular.net/nservicebus/testing/有一个非常巧妙的例子,说明如何测试一个简单的传奇。不幸的是它没有解释,如何用SqlSaga做同样的事情 - 即。一个持久存在状态的数据库到数据库。

鉴于这个传奇:

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属性数据尚未初始化

如何正确连接传奇以进行测试,以便:

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

1 个答案:

答案 0 :(得分:2)

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

您可以将此作为起点,并按以下方式修改传奇测试:

  1. 添加NServiceBus.Persistence.Sql包。
  2. 修改DiscountPolicy政策传奇以继承SqlSaga而不是Saga
  3. 解决编译错误(添加缺少的方法和属性,您可以将它们保留为空,并删除ConfigureHowToFindSaga方法)。
  4. 我希望有所帮助,但如果有任何遗漏或您的方案无法通过这种方式进行测试,请告诉我。