今天我艰难地意识到,saga 测试不使用 ConfigureHowToFindSaga
。这会导致生产中出现“未找到 Saga”异常,因为我的测试未涵盖映射,而我认为应该涵盖映射。我创建了一个非常简单的示例传奇来说明问题:
public class MySpecialSaga : Saga<MySagaData>,
IAmStartedByMessages<StartMessage>,
IHandleMessages<NextMessage>
{
public void Handle(StartMessage message)
{
Data.SagaId = message.Id;
Console.WriteLine("Saga started with id: " + message.Id);
}
public void Handle(NextMessage message)
{
Console.WriteLine("Handling next message with id: " + message.Id);
Bus.Send(new StartMessage() {Id = message.Id + 1});
}
}
public class NextMessage : ICommand
{
public int Id { get; set; }
}
public class StartMessage : ICommand
{
public int Id { get; set; }
}
public class MySagaData : IContainSagaData
{
public Guid Id { get; set; }
public string Originator { get; set; }
public string OriginalMessageId { get; set; }
public int SagaId { get; set; }
}
现在我有以下两个测试:
[TestFixture]
public class MySpecialSagaTests
{
public MySpecialSagaTests()
{
Test.Initialize();
}
[Test]
public void WhenSagaDoesNotExistItShouldNotFindSaga()
{
Test.Saga<MySpecialSaga>()
.ExpectNotSend<StartMessage>(m => m.Id == 2)
.When(s => s.Handle(new NextMessage() {Id = 1}));
}
[Test]
public void WhenSagaDoesExistItShouldFindSaga()
{
Test.Saga<MySpecialSaga>()
.When(s => s.Handle(new StartMessage(){ Id = 1}))
.ExpectNotSend<StartMessage>(m => m.Id == 2)
.When(s => s.Handle(new NextMessage() {Id = 1}));
}
}
第一个应该失败,或者至少不发送消息,因为它不应该找到传奇。当我添加 ConfigureHowToFindSaga
方法后,第二个测试应该会通过。由于某种原因,在测试传奇时,不考虑这一点。这可能会导致传奇中的处理程序由于缺少映射而不会被执行。
应该如何测试这个场景?
最佳答案
目前不支持单元测试映射。这里提到的严格模式将支持这种类型的测试。
关于c# - 如何测试我的ConfigureHowToFindSaga 是否在NServiceBus 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19681055/