Сегодня я понял, на собственном горьком опыте, что тестирование саги не использует ConfigureHowToFindSaga
. Это приводит к тому, что в рабочей среде появляется исключение «Saga not found», поскольку мой тест не охватывает сопоставление, которое, как я думаю, должно быть. Я создал действительно простой пример саги, иллюстрирующий проблему:
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
. Почему-то при тестировании саг это не учитывается. Это может привести к тому, что в саге есть обработчики, которые не будут выполняться из-за отсутствия сопоставления.
Как следует протестировать этот сценарий?