Как подключить SqlSaga NServiceBus в тестовом сценарии?

На 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. Реальное подключение к базе данных на самом деле не требуется

person Carsten Gehling    schedule 15.06.2018    source источник
comment
Проблема 1 может быть решена путем инициализации SUT как var sut = new CreateSomeFancySaga() { Data = new MySagaData() }, но я не уверен, поможет ли это решить проблему 2.   -  person Carsten Gehling    schedule 15.06.2018
comment
Проблема 2 на самом деле спорная, так как метод Handle тестируется изолированно. Это означает, что ничто не вызывает логику постоянства.   -  person Carsten Gehling    schedule 18.06.2018


Ответы (1)


У нас есть связанный пример кода, показывающий модульное тестирование более подробно: https://docs.particular.net/samples/unit-testing/. Это включает в себя пару тестов для саги (SagaTests.cs).

Вы можете взять это за отправную точку и изменить тесты саги следующим образом:

  1. Добавьте пакет NServiceBus.Persistence.Sql.
  2. Измените сагу политики DiscountPolicy, чтобы она наследовала от SqlSaga вместо Saga.
  3. Устраните ошибки компиляции (добавьте отсутствующие метод и свойство, вы можете оставить их пустыми, а также удалите метод ConfigureHowToFindSaga).

Я надеюсь, что это поможет, но дайте мне знать, если чего-то не хватает или ваш сценарий не может быть протестирован таким образом.

person wlabaj    schedule 15.06.2018
comment
Это было также решение, к которому я пришел, как указано в комментарии к моему OP. Я думаю, что я был слишком поглощен тем фактом, что я тестировал что-то со встроенной сохраняемостью SQL, хотя на самом деле это не так: я тестирую только полностью изолированный метод Handle(). Так что на самом деле не имело значения, что это был SqlSaga, за исключением необходимости добавления пакета NServiceBus.Persistence.Sql. Может быть, вы могли бы добавить эту информацию в свои документы - это было бы очень полезно. - person Carsten Gehling; 18.06.2018