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 类型的值相等性语义

测试内容

  • 创建两个完全相同的实例 ab
  • 创建一个不同的实例 c(MessageId 不同)
  • 验证相同内容的实例相等,不同内容的实例不相等
  • 测试了 Equals() 方法和 == 操作符

3. Record_WithExpression_ShouldCreateNewInstance

[Fact]
public void Record_WithExpression_ShouldCreateNewInstance()

测试目的:验证 record 的 with 表达式功能

测试内容

  • 创建原始实例 a
  • 使用 with 表达式创建新实例 b,只修改 PublishAttempts 属性
  • 验证原实例保持不变
  • 验证新实例具有更新的属性值
  • 验证两个实例是不同的对象引用(NotSame

技术特点

这个测试类体现了 C# record 类型的三个核心特性:

  1. 不可变性:属性通过构造函数设置后不可修改
  2. 值相等性:基于内容而非引用进行相等性比较
  3. 非破坏性变异:通过 with 表达式创建修改版本的新实例

这种设计模式在消息队列系统中很有用,因为消息条目通常应该是不可变的,以确保数据一致性和线程安全。

评论加载中...