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属性自定义所有路由参数 - 用于测试属性覆盖功能
设计模式和功能特点
- 约定优于配置:系统提供默认的命名约定,减少配置工作
- 灵活性:允许通过属性覆盖默认约定
- 类型安全:使用泛型方法确保类型安全
- 清晰的测试结构:每个测试专注于一个特定场景
这种设计使得消息路由既有合理的默认行为,又保持了足够的灵活性来满足特殊需求。
评论加载中...