Как я могу провести модульное тестирование потребителя MassTransit, который создает и выполняет маршрутную квитанцию?

В .NET Core 2.0 у меня есть довольно простой маршрут маршрутизации MassTransit, содержащий 2 действия. Это создается и выполняется в потребителе, и все это связано с автоматическим конечным автоматом. Все это отлично работает, хотя и требует нескольких финальных чистых настроек.

Однако я не могу понять, как лучше всего писать модульные тесты для моего потребителя, поскольку он создает маршрутную квитанцию. В моем потребителе есть следующий код:

public async Task Consumer(ConsumerContext<ProcessRequest> context)
{
   var builder = new RoutingSlipBuilder(NewId.NextGuid());

    SetupRoutingSlipActivities(builder, context);

    var routingSlip = builder.Build();

    await context.Execute(routingSlip).ConfigureAwait(false);
}

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

public void SetupRoutingSlipActivities(RoutingSlipBuilder builder, ConsumeContext<IProcessCreateLinkRequest> context)
{
        builder.AddActivity(
            nameof(ActivityOne),
            new Uri("execute_activity_one_example_address"),
            new ActivityOneArguments(
                context.Message.Id,
                context.Message.Name)
        );

        builder.AddActivity(
            nameof(ActivityTwo),
            new Uri("execute_activity_two_example_address"),
            new ActivityTwoArguments(
                context.Message.AnotherId,
                context.Message.FileName)
        );
}

Я попытался просто написать тесты для SetupRoutingSlipActivities, используя конструктор макетов Moq и MassTransit InMemoryTestHarness, но обнаружил, что метод AddActivity не виртуальный, поэтому я не могу проверить его как таковой:

aRoutingSlipBuilder.Verify(x => x.AddActivity(
                nameof(ActivityOne),
                new Uri("execute_activity_one_example_address"),
                It.Is<ActivityOne>(y => y.Id == 1 && y.Name == "A test name")));

Не обращайте внимания на некоторые странные данные в примерах кода, поскольку я просто представил упрощенную версию.

Есть ли у кого-нибудь рекомендации, как это сделать? Я также хотел протестировать, чтобы убедиться, что RoutingSlipBuilder был создан, но поскольку этот экземпляр создается в методе Consume, я не знал, как это сделать! Я много искал в Интернете и через репозиторий MassTransit, но ничего не выделялось.


person Ben Thomson    schedule 21.06.2018    source источник


Ответы (1)


Посмотрите, как написаны тесты Courier, есть ряд тестовых наборов, доступных для тестирования действий с ошибками маршрутизации. Хотя они плохо документированы, модульные тесты являются рабочим свидетельством того, как используется тестирование.

https://github.com/MassTransit/MassTransit/blob/develop/src/MassTransit.Tests/Courier/TwoActivityEvent_Specs.cs

person Chris Patterson    schedule 21.06.2018
comment
Я прошел через это, и именно они помогли мне понять, как писать модульные тесты моей активности, но я не видел там ничего, что помогло бы в этом сценарии (например, тестирование того, что я построил свой маршрутный лист с необходимыми задачами. и т.д). Может я чего то упускаю? - person Ben Thomson; 22.06.2018
comment
Я должен, вероятно, добавить, что я могу использовать InMemoryTestHarness для создания и отключения моего потребителя, просто тогда я могу проверить, правильно ли он настроил маршрутный лист. - person Ben Thomson; 22.06.2018