using Dpz.Core.MessageQueue.Models;
namespace Dpz.Core.MessageQueue.Test.Models;
public class MessageOutboxEntryTests
{
[Fact]
public void Record_ShouldExposeAllConstructorArguments()
{
var entry = new MessageOutboxEntry(
MessageId: "m-1",
Exchange: "ex",
RoutingKey: "rk",
Payload: "{\"a\":1}",
PublishAttempts: 2,
ConsumeAttempts: 3
);
Assert.Equal("m-1", entry.MessageId);
Assert.Equal("ex", entry.Exchange);
Assert.Equal("rk", entry.RoutingKey);
Assert.Equal("{\"a\":1}", entry.Payload);
Assert.Equal(2, entry.PublishAttempts);
Assert.Equal(3, entry.ConsumeAttempts);
}
[Fact]
public void Record_ShouldImplementValueEquality()
{
var a = new MessageOutboxEntry("m-1", "ex", "rk", "{}", 0, 0);
var b = new MessageOutboxEntry("m-1", "ex", "rk", "{}", 0, 0);
var c = new MessageOutboxEntry("m-2", "ex", "rk", "{}", 0, 0);
Assert.Equal(a, b);
Assert.True(a == b);
Assert.NotEqual(a, c);
}
[Fact]
public void Record_WithExpression_ShouldCreateNewInstance()
{
var a = new MessageOutboxEntry("m-1", "ex", "rk", "{}", 0, 0);
var b = a with { PublishAttempts = 5 };
Assert.Equal(0, a.PublishAttempts);
Assert.Equal(5, b.PublishAttempts);
Assert.NotSame(a, b);
}
}
⚠⚠ 以下内容为AI分析的结果,请根据实际情况进行判断。
这是一个针对 MessageOutboxEntry 类的单元测试文件。从代码结构来看,MessageOutboxEntry 应该是一个 C# record 类型,用于表示消息队列系统中的出站消息条目。
代码解释
测试类概述
MessageOutboxEntryTests 包含三个单元测试方法,用于验证 MessageOutboxEntry record 的核心功能。
测试方法详解
1. Record_ShouldExposeAllConstructorArguments
[Fact]
public void Record_ShouldExposeAllConstructorArguments()
测试目的:验证构造函数参数是否正确暴露为只读属性
测试内容:
- 创建一个
MessageOutboxEntry实例,传入所有构造参数 - 验证每个属性值是否与构造时传入的值一致
参数含义:
MessageId: 消息唯一标识符Exchange: 消息交换机名称RoutingKey: 路由键Payload: 消息负载(JSON 格式)PublishAttempts: 发布尝试次数ConsumeAttempts: 消费尝试次数
2. Record_ShouldImplementValueEquality
[Fact]
public void Record_ShouldImplementValueEquality()
测试目的:验证 record 类型的值相等性语义
测试内容:
- 创建两个完全相同的实例
a和b - 创建一个不同的实例
c(MessageId 不同) - 验证相同内容的实例相等,不同内容的实例不相等
- 测试了
Equals()方法和==操作符
3. Record_WithExpression_ShouldCreateNewInstance
[Fact]
public void Record_WithExpression_ShouldCreateNewInstance()
测试目的:验证 record 的 with 表达式功能
测试内容:
- 创建原始实例
a - 使用
with表达式创建新实例b,只修改PublishAttempts属性 - 验证原实例保持不变
- 验证新实例具有更新的属性值
- 验证两个实例是不同的对象引用(
NotSame)
技术特点
这个测试类体现了 C# record 类型的三个核心特性:
- 不可变性:属性通过构造函数设置后不可修改
- 值相等性:基于内容而非引用进行相等性比较
- 非破坏性变异:通过
with表达式创建修改版本的新实例
这种设计模式在消息队列系统中很有用,因为消息条目通常应该是不可变的,以确保数据一致性和线程安全。
评论加载中...