#masstransit #automatonymous
Вопрос:
Я пытаюсь выполнить модульные тесты на обычае 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
или запустить это в тестовом режиме? Чтобы я мог также провести модульное тестирование этого действия?
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)
{
Ответ №1:
В MassTransit есть тестовые жгуты, позволяющие тестировать государственные машины, а также действия с использованием внедрения зависимостей.
Идея «тестирования в изоляции с помощью насмешек» довольно бессмысленна, учитывая доступность этих жгутов.
Комментарии:
1. Спасибо за быстрый ответ! Я смотрел на это, но я просто не могу понять, как проверить активность в изоляции? У меня есть тесты, настроенные для всей саги с использованием тестового жгута, но у меня есть некоторые действия со сложной логикой, в которых было бы неплохо просто
new Activity()
выполнять тесты и делать утверждения на основе нескольких разных входных данных.2. Я не предоставляю никакого способа проверить действие само по себе, я не уверен, какое значение это даст, кажется чрезмерным по сравнению с тестированием его в контексте государственной машины.
3. Хорошо! Тогда я, по крайней мере, знаю. Спасибо! Я думаю, что могу манипулировать состоянием государственной машины, чтобы получить нужные мне тесты на уровне активности.