using Dpz.Core.Entity.Base;
using Dpz.Core.MessageQueue.Attributes;
using Dpz.Core.MessageQueue.Enums;
using Dpz.Core.MessageQueue.RabbitMQ;

namespace Dpz.Core.MessageQueue.Test.RabbitMQ;

public class DefaultMessageRoutingConventionTests
{
    [Fact]
    public void ConventionNames_ShouldUseTypeName_WhenNoAttribute()
    {
        var sut = new DefaultMessageRoutingConvention();

        var exchange = sut.GetExchangeName<NewsArticleMessage>();
        var queue = sut.GetQueueName<NewsArticleMessage>();
        var routingKey = sut.GetRoutingKey<NewsArticleMessage>();
        var type = sut.GetExchangeType<NewsArticleMessage>();

        Assert.Equal("dpz.news.exchange", exchange);
        Assert.Equal("dpz.news.article.queue", queue);
        Assert.Equal("news.article.#", routingKey);
        Assert.Equal(ExchangeType.Topic, type);
    }

    [Fact]
    public void ConventionNames_ShouldUseAttributeOverrides_WhenSpecified()
    {
        var sut = new DefaultMessageRoutingConvention();

        var exchange = sut.GetExchangeName<CustomRouteMessage>();
        var queue = sut.GetQueueName<CustomRouteMessage>();
        var routingKey = sut.GetRoutingKey<CustomRouteMessage>();
        var type = sut.GetExchangeType<CustomRouteMessage>();

        Assert.Equal("custom.exchange", exchange);
        Assert.Equal("custom.queue", queue);
        Assert.Equal("custom.route", routingKey);
        Assert.Equal(ExchangeType.Direct, type);
    }

    private sealed class NewsArticleMessage : MessageBase { }

    [MessageRoute(
        ExchangeName = "custom.exchange",
        QueueName = "custom.queue",
        RoutingKey = "custom.route",
        ExchangeType = ExchangeType.Direct
    )]
    private sealed class CustomRouteMessage : MessageBase { }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这是一个单元测试类,用于测试 DefaultMessageRoutingConvention 类的消息路由约定功能。让我详细解释一下代码的结构和作用:

代码结构分析

1. 类的目的

DefaultMessageRoutingConventionTests 是一个测试类,专门测试RabbitMQ消息队列中的默认路由约定规则。

2. 测试方法

第一个测试:ConventionNames_ShouldUseTypeName_WhenNoAttribute()

  • 测试目标:验证当消息类没有特殊属性标注时,系统使用默认的命名约定
  • 测试逻辑
    • 使用 NewsArticleMessage 类(没有任何特殊属性)
    • 验证生成的交换机名称为 "dpz.news.exchange"
    • 验证生成的队列名称为 "dpz.news.article.queue"
    • 验证生成的路由键为 "news.article.#"
    • 验证交换机类型为 Topic

第二个测试:ConventionNames_ShouldUseAttributeOverrides_WhenSpecified()

  • 测试目标:验证当消息类使用 MessageRoute 属性时,系统优先使用属性中指定的配置
  • 测试逻辑
    • 使用 CustomRouteMessage 类(带有 MessageRoute 属性)
    • 验证生成的配置完全按照属性中的指定值:
      • 交换机:"custom.exchange"
      • 队列:"custom.queue"
      • 路由键:"custom.route"
      • 交换机类型:Direct

3. 测试用例类

NewsArticleMessage

  • 继承自 MessageBase
  • 没有任何特殊属性,用于测试默认约定

CustomRouteMessage

  • 继承自 MessageBase
  • 使用 MessageRoute 属性自定义所有路由参数
  • 用于测试属性覆盖功能

设计模式和功能特点

  1. 约定优于配置:系统提供默认的命名约定,减少配置工作
  2. 灵活性:允许通过属性覆盖默认约定
  3. 类型安全:使用泛型方法确保类型安全
  4. 清晰的测试结构:每个测试专注于一个特定场景

这种设计使得消息路由既有合理的默认行为,又保持了足够的灵活性来满足特殊需求。

评论加载中...