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属性数据尚未初始化。
如何正确连接传奇以进行测试,以便:
答案 0 :(得分:2)
我们有一个相关的代码示例,更详细地展示了单元测试:https://docs.particular.net/samples/unit-testing/。这包括对saga(SagaTests.cs
)的几个测试。
您可以将此作为起点,并按以下方式修改传奇测试:
NServiceBus.Persistence.Sql
包。DiscountPolicy
政策传奇以继承SqlSaga
而不是Saga
。ConfigureHowToFindSaga
方法)。我希望有所帮助,但如果有任何遗漏或您的方案无法通过这种方式进行测试,请告诉我。