【发布时间】: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 可以通过将 SUT 初始化为 var sut = new CreateSomeFancySaga() { Data = new MySagaData() } 来解决 - 但我不确定它是否有助于解决问题2.
-
问题 2 实际上没有实际意义,因为 Handle 方法是独立测试的。这意味着没有任何东西调用持久化逻辑。
标签: testing nservicebus nservicebus-sagas