Массовая проблема с добавлением полезной нагрузки для запроса/ответа в модульном тестировании, альтернативное использование каналов в модульных тестах

#c# #.net #unit-testing #masstransit

Вопрос:

в настоящее время у меня проблема с тем, что я хочу написать модульные тесты для Masstransit в .NET. У моего потребителя запроса/ответа есть некоторые фильтры потребителей, один из этих фильтров генерирует дополнительные данные в качестве полезной нагрузки сообщения и прикрепляет их к сообщению запроса. Чтобы протестировать моего потребителя в модульном тесте, я хотел бы добавить полезную нагрузку.

Q1) Можно ли добавить полезную нагрузку в сообщение запроса Q2) В качестве альтернативы, могу ли я создать насмешливый фильтр и установить его в качестве фильтра потребителя в конвейере? (Который задает полезную нагрузку)

Это моя последняя попытка:

     public class ContactCommandConsumerTest
    {
        [Fact]
        public async Task CreateContactOnUserRequestConsumer_RequestConsumer_IsAttached()
        {
            var harness = new InMemoryTestHarness { TestTimeout = TimeSpan.FromSeconds(5) };

[...]


            var consumer = harness.Consumer<CreateContactOnUserRequestCommandConsumer>(() => new CreateContactOnUserRequestCommandConsumer(loggerConsumer, mapper,kontakteintragRep,machineTime));
            var pipe = Pipe.New<PipeContext>(x => x.UseFilter(new MockFilter<PipeContext>()));


            // harness.Consumer<CreateContactOnUserRequestCommandConsumer>();
            await harness.Start();

            

            try
            {
                harness.Bus.ConnectConsumePipe<CreateContactOnUserRequestCommandConsumer>(pipe);

                var requestClient = await harness.ConnectRequestClient<CreateContactOnUserRequestCommand>();

                var response = await requestClient.GetResponse<AcceptedResponse, FaultedResponse>(new
                {
                    EntityInfo = "Vb48cc135-4593-4b96-bb29-2cf136b3d1ee",

                });


                Assert.True(consumer.Consumed.Select<CreateContactOnUserRequestCommand>().Any());
                Assert.True(harness.Sent.Select<FaultedResponse>().Any());


            }
            finally
            {
                await harness.Stop();
            }
        }
    }

    internal class MockFilter<T> : IFilter<T> where T: class, PipeContext
    {
        public void Probe(ProbeContext context)
        {
            context.CreateFilterScope("mock");
        }

        public async Task Send(T context, IPipe<T> next)
        {
            context.GetOrAddPayload(() => new ContextUserPayload() { ContextUser = new Guid("dc6e091f-669e-45b3-9dd6-a36316f70527") });
            await next.Send(context);
        }
    }
 

Я попытался построить трубу и добавить ее в «harness.bus.ConnectConsumerPipe». Но макет фильтра никогда не вызывается ???

Ответ №1:

Вы используете OnConfigureInMemoryBus событие в InMemoryTestHarness , чтобы добавить фильтр в конечную точку шины.

Похоже на:

 harness.OnConfigureInMemoryBus  = configurator =>
{
    configurator.UseFilter(...);
}
 

Чтобы добавить фильтр в запрос, используйте:

 using RequestHandle<TRequest> requestHandle = requestClient.Create(message, cancellationToken);

requestHandle.UseFilter(...);

return await requestHandle.GetResponse<TResponse>().ConfigureAwait(false);
 

Комментарии:

1. Решение все еще не касается моего фильтра. ДИ: услуги. AddMediator(x => { x.ConfigureMediator((контекст, cfg) =>> { cfg.UseConsumeFilter(тип(контекстный фильтр>><>),контекст); }); Попробуйте использовать жгут. OnConfigureInMemoryBus = conf => { conf. Фильтр использования<PipeContext>(новый макет фильтра<PipeContext><ConsumeContext<PipeContext><PipeContext>>()); }; —<PipeContext>>> Нет фильтра с именем conf. UseConsumeFilter(тип(MockFilter<>), ???);

2. Все ваши общие типы неверны, вы должны использовать этот метод расширения , чтобы добавить свой фильтр, где T находится ваш тип сообщения.

3. Я был на неверном пути, теперь он работает, используя .жгут. OnConfigureInMemoryBus = conf => { conf. Фильтр использования<CommandX>(новый макет фильтра<CommandX><ConsumeContext<CommandX><CommandX>>()); } Спасибо за вашу помощь. Кстати: Спасибо вам также за разработку MassTransit, которая экономит нам много времени