Используя 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; }
}
}
}