当前位置: 首页 > news >正文

单元测试之Arrange-Act-Assert(简称AAA)

Arrange-Act-Assert(简称AAA)是一种编写单元测试的标准模式,具有清晰的结构和明确的步骤,有助于提高测试的可读性、可维护性和可扩展性。以下是对每个步骤的详细说明:

1. Arrange(准备阶段)

在这一阶段,你需要设置测试所需的环境,包括但不限于:

  • 初始化被测对象。
  • 创建模拟对象或存根(如果需要的话)。
  • 设置输入数据或配置被测对象的状态。

示例:

// 创建并配置模拟对象
var mockRepository = Substitute.For<IRepository>();
mockRepository.SaveOrder(Arg.Any<Order>()).Returns(true);

// 初始化被测对象
var orderService = new OrderService(mockRepository);

2. Act(执行阶段)

这是测试的核心部分,在这里你调用被测对象的方法或执行你想要验证的行为。这个步骤应该是直接且单一的,理想情况下只包含一个动作。

示例:

// 调用被测方法
var result = orderService.ProcessOrder(new Order { Id = 1, Description = "Test Order" });

3. Assert(断言阶段)

在最后一步中,你将验证执行阶段的结果是否符合预期。这可能包括检查返回值、状态变化或确认某些行为(如方法调用)确实发生了。

示例:

// 验证结果
Assert.Equal("Order saved successfully!", result);
mockRepository.Received().SaveOrder(Arg.Any<Order>()); // 确认 SaveOrder 方法被调用

完整示例

结合上述各部分,这里有一个完整的使用 Arrange-Act-Assert 模式的单元测试示例:

using NSubstitute;
using Xunit;

public class OrderServiceTests
{
    [Fact]
    public void ProcessOrder_ShouldReturnSuccess_WhenSaveOrderSucceeds()
    {
        // Arrange
        var mockRepository = Substitute.For<IRepository>();
        mockRepository.SaveOrder(Arg.Any<Order>()).Returns(true); // 准备:设置模拟对象行为

        var orderService = new OrderService(mockRepository); // 准备:初始化被测对象
        var testOrder = new Order { Id = 1, Description = "Test Order" }; // 准备:设置输入数据

        // Act
        var result = orderService.ProcessOrder(testOrder); // 执行:调用被测方法

        // Assert
        Assert.Equal("Order saved successfully!", result); // 断言:验证返回值
        mockRepository.Received().SaveOrder(testOrder); // 断言:验证 SaveOrder 方法被调用
    }
}

通过遵循 AAA 模式,你的测试会变得更加结构化和清晰,不仅有助于你自己理解和维护代码,也能让其他开发者更容易地阅读和贡献代码。

 

http://www.dtcms.com/a/97236.html

相关文章:

  • 【空间变换】欧拉角与四元数
  • UE5.5_Mass框架——UE的ECS框架
  • 智慧城市智慧调度系统的架构与关键技术研究
  • 算法基础_基础算法【快速排序 + 归并排序 + 二分查找】
  • 做的一些实验
  • 记录一次TDSQL事务太大拆过binlog阈值报错
  • C语言中栈和堆详解及区别
  • MySQL General Log
  • Ubuntu 22.04.5 LTS 设置时间同步 ntp
  • Android打aar包问题总结
  • 企业为何青睐数字孪生大屏?技术驱动与价值重构的双重逻辑
  • oracle中java类的使用
  • 代码随想录动态规划05
  • Problem E: 多态
  • Jmeter触发脚本备份
  • MySQL 8.0登录root账号报错ERROR 1045 (28000)
  • 职场新人面对不懂的问题应该如何寻求帮助?
  • 对于有前后逻辑依赖关系的长文本,切分时确实需要特别注意上下文的连续性,以便在召回后知识时能够尽量保留前后文的关联。
  • 【NLP 46、大模型技术发展】
  • 小爱控制via电视浏览器搜索图片-Homeassistant重制上一个自动化
  • AI 时代,Java 和 Python 哪个好就业?
  • R002-云计算
  • 什么是SQL作业
  • 构建大语言模型应用:数据准备(第二部分)
  • 深度赋能!北京智和信通融合DeepSeek,解锁智能运维无限可能
  • 我“研发”的cjklen助力python精准“中文”对齐(计数补偿实现,cjklen有两种逻辑三个变体。DeepSeek整理文稿)
  • 【人工智能】解锁大模型潜力:Ollama 与 DeepSeek 的分布式推理与集群部署实践
  • AI: 文生视频的主流产品
  • Transformer:破局山地暴雨预测的「地形诅咒」--AI智能体开发与大语言模型的本地化部署、优化技术
  • django连接数据库