繁体   English   中英

MassTransit - 单位测试大型有效负载消费者

[英]MassTransit - Unit Testing a Large Payload Consumer

使用InMemoryTestHarness,我正在对使用MessageData属性处理命令的Consumer进行单元测试。 使用InMemoryMessageDataRepository填充MessageData属性然而,当消费者尝试加载有效负载(message.Body.Value)时,我收到以下异常:“消息数据未加载:urn:msgdata:xxxxxxxxxxxxxxxxxxxxxxxxxx”}。 对使用MessageData属性处理命令的使用者进行单元测试的正确方法是什么?

我打算使用内存中传输,但它似乎不是正确的方法,因为单元测试不会收到消费者的即时反馈。 最终目标是我的单元测试能够断言抛出特定异常或消费者成功完成而没有错误。

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; }
        }
    }
}

您需要配置接收端点以处理消息数据属性,类似于:

e.UseMessageData<BigMessageCommand>(dataRepo);

由于您正在使用测试工具,因此可以在添加使用者测试工具之前将其添加到接收端点:

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

harness.OnConfigureReceiveEndpoint += ConfigureReceiveEndpoint;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM