MassTransit - модульное тестирование потребителя с большой полезной нагрузкой - PullRequest
0 голосов
/ 17 мая 2019

Используя InMemoryTestHarness, я работаю над модульным тестированием Потребителя, который обрабатывает команду со свойством MessageData.Использование InMemoryMessageDataRepository для заполнения свойства MessageData работает нормально, однако, когда потребитель пытается загрузить полезную нагрузку (message.Body.Value), я получаю следующее исключение: «Данные сообщения не были загружены: urn: msgdata: xxxxxxxxxxxxxxxxxxxxxxxxxx»}.Как правильно провести модульное тестирование потребителя, который обрабатывает команды со свойством MessageData?

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

using System;
using System.Linq;
using System.Threading.Tasks;
using MassTransit;
using MassTransit.MessageData;
using MassTransit.Testing;
using Newtonsoft.Json;
using Xunit;

namespace Test
{
    public class LargePayloadConsumerTest
    {
        [Fact]
        public async Task Consumer_Should_Deserialize_Message()
        {
            var harness = new InMemoryTestHarness();
            var consumer = harness.Consumer<BigMessageConsumer>();
            var command = new BigMessageCommand();
            var dataRepo = new InMemoryMessageDataRepository();

            var largePayload = new BigMessagePayload()
            {
                Id = 1,
                FirstName = "TestFirstName",
                MiddleName = "TestMiddleName",
                LastName = "TestLastName"
            };


            var json = JsonConvert.SerializeObject(largePayload);
            command.Body = await dataRepo.PutString(json);

            var thisWorks = await command.Body.Value;
            await harness.Start();
            await harness.InputQueueSendEndpoint.Send(command);

            Assert.True(harness.Consumed.Select<BigMessageCommand>().Any());
        }

        public class BigMessageConsumer : IConsumer<BigMessageCommand>
        {
            public async Task Consume(ConsumeContext<BigMessageCommand> context)
            {
                try
                {
                    var json = await context.Message.Body.Value;
                    var deserialized = JsonConvert.DeserializeObject<BigMessagePayload>(json);
                    Console.WriteLine($"{deserialized.Id}: {deserialized.FirstName} {deserialized.MiddleName} {deserialized.LastName}");
                }
                catch (Exception e)
                {
                    //throws {"The message data was not loaded: urn:msgdata:xxxxxxxxxxxxxxxxxxxxxxxxxx"}
                    Console.WriteLine(e);
                    throw;
                }
            }
        }

        public class BigMessageCommand
        {
            public MessageData<string> Body { get; set; }
        }

        public class BigMessagePayload
        {
            public int Id { get; set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public string MiddleName { get; set; }
        }
    }
}

1 Ответ

0 голосов
/ 19 мая 2019

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

e.UseMessageData<BigMessageCommand>(dataRepo);

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

void ConfigureReceiveEndpoint(IReceiveEndpointConfigurator configurator)
{
    configurator.UseMessageData<BigMessageCommand>(dataRepo);
}

harness.OnConfigureReceiveEndpoint += ConfigureReceiveEndpoint;
...