Тестирование активности саги конечного автомата MassTransit

Я пытаюсь выполнить модульные тесты на пользовательском Activity, который у меня есть для моей саги о конечном автомате MassTransit.

Выглядит это примерно так:

public class UpdateActivity : Activity<UpdateState>
{
    private readonly ConsumeContext _consumeContext;
    private readonly ILogger<UpdateActivity> _logger;

    public UpdateActivity(
        ConsumeContext consumeContext,
        ILogger<UpdateActivity> logger
    )
    {
        _consumeContext = consumeContext;
        _logger = logger;
    }

    public void Probe(ProbeContext context) => context.CreateScope(nameof(UpdateActivity));

    public void Accept(StateMachineVisitor visitor) => visitor.Visit(this);

    public async Task Execute(BehaviorContext<UpdateState> context, Behavior<UpdateState> next)
    {
        await DoStuffAsync(context.Instance);
        await next.Execute(context).ConfigureAwait(false);
    }

    public async Task Execute<T>(BehaviorContext<UpdateState, T> context, Behavior<UpdateState, T> next)
    {
        await DoStuffAsync(context.Instance);
        await next.Execute(context).ConfigureAwait(false);
    }

    public Task Faulted<TException>(BehaviorExceptionContext<UpdateState, TException> context, Behavior<UpdateState> next) where TException : Exception
        => next.Faulted(context);

    public Task Faulted<T, TException>(BehaviorExceptionContext<UpdateState, T, TException> context, Behavior<UpdateState, T> next) where TException : Exception
        => next.Faulted(context);
}

Я не могу понять, как я могу имитировать / подделывать ожидания для ConsumeContext при написании модульных тестов для этого класса. Я пытался найти что-то с помощью InMemoryTestHarness, но не могу найти ничего подходящего.

РЕДАКТИРОВАТЬ:

С таким же успехом я мог бы бросить сюда и эту. Как издеваться над context или запустить это в тестовой системе? Чтобы я мог также провести модульное тестирование этого Activity?

    public class UpdateActivity : Activity<UpdateState, IDataUpdatedEvent>
    {
        private readonly ILogger<UpdateActivity> _logger;

        public UpdateActivity(
            ILogger<UpdateActivity > logger
        )
        {
            _logger = logger;
        }

        public void Probe(ProbeContext context) => context.CreateScope(nameof(UpdateActivity));

        public void Accept(StateMachineVisitor visitor) => visitor.Visit(this);

        public async Task Execute(BehaviorContext<UpdateState, IDataUpdatedEvent> context, Behavior<UpdateState, IDataUpdatedEvent> next)
        {

person Joel    schedule 10.05.2021    source источник


Ответы (1)


MassTransit имеет тестовые средства, позволяющие использовать конечные автоматы. протестированы вместе с действиями, использующими внедрение зависимостей.

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

person Chris Patterson    schedule 10.05.2021
comment
Спасибо за быстрый ответ! Я смотрел на это, но я просто не могу понять, как тестировать Activity изолированно? У меня есть настройка тестов для всей саги с использованием тестовой оснастки, но у меня есть некоторые действия со сложной логикой, где было бы неплохо просто new Activity() в тестах и ​​делать утверждения, основанные на нескольких различных входных данных. - person Joel; 10.05.2021
comment
Я не предлагаю никакого способа протестировать действие само по себе, я не уверен, какое значение это даст, кажется чрезмерным по сравнению с его тестированием в контексте конечного автомата. - person Chris Patterson; 10.05.2021
comment
Хорошо! По крайней мере, тогда я знаю. Спасибо! Думаю, я могу управлять состоянием конечного автомата, чтобы получить нужные мне тесты на уровне активности. - person Joel; 10.05.2021