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

单元测试之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(){// Arrangevar 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" }; // 准备:设置输入数据// Actvar result = orderService.ProcessOrder(testOrder); // 执行:调用被测方法// AssertAssert.Equal("Order saved successfully!", result); // 断言:验证返回值mockRepository.Received().SaveOrder(testOrder); // 断言:验证 SaveOrder 方法被调用}
}

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

 

相关文章:

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

Arrange-Act-Assert&#xff08;简称AAA&#xff09;是一种编写单元测试的标准模式&#xff0c;具有清晰的结构和明确的步骤&#xff0c;有助于提高测试的可读性、可维护性和可扩展性。以下是对每个步骤的详细说明&#xff1a; 1. Arrange&#xff08;准备阶段&#xff09; 在…...

厘米级定位赋能智造升级:品铂科技UWB技术驱动工厂全流程自动化与效能跃升”

在智能制造中的核心价值体现在‌高精度定位、流程优化、安全管理‌等多个维度&#xff0c;具体应用如下&#xff1a; 一、‌核心技术与定位能力‌ ‌厘米级高精度定位‌ UWB技术通过‌纳秒级窄脉冲信号‌&#xff08;带宽超500MHz&#xff09;实现高时间分辨率&#xff0c;结合…...

C++刷题(四):vector

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及刷题记录&#xff0c;使用语言为C。 每道题我会给出LeetCode上的题号&#xff08;如果有题号&#xff09;&#xff0c;题目&#xff0c;以及最后通过的代码。没有题号的题目大多来自牛客网。对于题目的…...

学习记录706@微信小程序+springboot项目 真机测试 WebSocket错误: {errMsg: Invalid HTTP status.}连接不上

我微信小程序springboot项目 真机测试 websocket 总是报错 WebSocket错误: {errMsg: Invalid HTTP status.}&#xff0c;总是连接不上&#xff0c;但是开发者工具测试就没有问题。 最后解决方案是编码token&#xff0c;之前是没有编码直接拼接的&#xff0c;原因不详。 consol…...

【虚拟仪器技术】Labview虚拟仪器技术应用教程习题参考答案[13页]

目录 第1章 第2章 第3章 第4章 第&#xff15;章 第&#xff16;章 第&#xff17;章 第8章 第1章 1. 简述虚拟仪器概念。 参考答案&#xff1a;虚拟仪器是借助于强大的计算机软件和硬件环境的支持&#xff0c;建立虚拟的测试仪器面板&#xff0c;完成仪器的控制、数…...

【工作梳理】怎么把f12里面的东西导入到postman

postman左上角导入 结果&#xff1a;...

UE5学习笔记 FPS游戏制作34 触发器切换关卡

文章目录 搭建关卡制作触发器传送门显示加载界面 搭建关卡 首先搭建两个关卡&#xff0c;每个关卡里至少要有一个角色 制作触发器传送门 1 新建一个蓝图&#xff0c;父类为actor&#xff0c;命名为portal&#xff08;传送门&#xff09; 2 为portal添加一个staticMesh&#…...

智谱大模型(ChatGLM3)PyCharm的调试指南

前言 最近在看一本《ChatGLM3大模型本地化部署、应用开发和微调》&#xff0c;本文就是讨论ChatGLM3在本地的初步布设。&#xff08;模型文件来自魔塔社区&#xff09; 1、建立Pycharm工程 采用的Python版本为3.11 2、安装对应的包 2.1、安装modelscope包 pip install model…...

新专栏预告 《AI大模型应知应会短平快系列100篇》 - 整体规划设计

做个预告&#xff0c;为系统化梳理AI大模型的发展脉络&#xff0c;并为普及AI素养做一点贡献&#xff0c;特给自己制定了一个小目标&#xff0c;3个月内完成交稿。 AI大模型应知应会短平快系列100篇 - 整体规划设计 一、基础知识模块&#xff08;20篇&#xff09; 1.1 大模型…...

SwanLab Slack通知插件:让AI训练状态同步更及时

在AI模型训练的过程中&#xff0c;开发者常常面临一个难题&#xff1a;如何及时跟踪训练状态&#xff1f;无论是实验超参数的调整、关键指标的变化&#xff0c;还是意外中断的告警&#xff0c;传统的监控方式往往依赖手动刷新日志或反复检查终端&#xff0c;这不仅效率低下&…...

收集 的 JavaScript 数组方法表格

这个表格可以作为数组方法的快速参考指南 方法名对应版本功能原数组是否改变返回值类型concat()ES5-合并数组&#xff0c;并返回合并之后的新数组nArrayjoin()ES5-使用分隔符&#xff0c;将数组转为字符串并返回nStringpop()ES5-删除最后一位&#xff0c;并返回删除的数据yAny…...

操作系统高频(六)linux内核

操作系统高频&#xff08;六&#xff09;linux内核 1.内核态&#xff0c;用户态的区别⭐⭐⭐ 内核态和用户态的区别主要在于权限和安全性。 权限&#xff1a;内核态拥有最高的权限&#xff0c;可以访问和执行所有的系统指令和资源&#xff0c;而用户态的权限相对较低&#x…...

位置编码汇总 # 持续更新

看了那么多还没有讲特别好的&#xff0c;GPT老师讲的不错关于三角函数编码。 一、 手撕transformer常用三角位置编码 GPT说&#xff1a;“低维度的编码&#xff08;例如&#xff0c;第一个维度&#xff09;可以捕捉到大的位置差异&#xff0c;而高维度的编码则可以捕捉到小的细…...

电阻(Resistor)详解

一、电阻的定义与核心作用 电阻是电子电路中用于 限制电流、分压、调节信号电平、消耗功率 的基础被动元件&#xff0c;其阻值&#xff08;Resistance&#xff09;单位为欧姆&#xff08;Ω&#xff09;。其核心作用可归纳为&#xff1a; 限流保护&#xff1a;防止元器件过电流…...

DaVinci Resolve19.1下载:达芬奇调色中文版+安装步骤

如大家所了解的&#xff0c;DaVinci Resolve中文名为达芬奇&#xff0c;是一款专业视频编辑与调色软件。它最初以调色功能闻名&#xff0c;但经过多年发展&#xff0c;已扩展为一套完整的后期制作解决方案&#xff0c;涵盖了剪辑、视觉特效、动态图形和音频后期制作等多个模块。…...

文件IO 2

补充一些用到前面没提到的方法 isDirectory()方法&#xff0c;检查一个对象是否是文件夹&#xff0c;是true不是false isFile()方法&#xff0c;检测一个对象是否为文件,是true不是false 文件的读写操作实践 上一篇大致讲了文件读写操作的基本操作&#xff0c;下面是实践时…...

【Word】批注一键导出:VBA 宏

&#x1f4cc; VBA 宏代码实现 下面是完整的 VBA 代码&#xff0c;支持&#xff1a; 自动创建新文档&#xff0c;并将当前 Word 文档的所有批注导出。批注格式清晰&#xff0c;包括编号、作者、日期和批注内容。智能检测&#xff0c;如果当前文档没有批注&#xff0c;则提示用…...

《深度洞察:MySQL与Oracle中游标的性能分野》

在数据库管理的复杂领域中&#xff0c;游标作为一种强大的工具&#xff0c;用于对数据进行逐行处理&#xff0c;为许多复杂的数据操作提供了解决方案。然而&#xff0c;当涉及到MySQL和Oracle这两大主流数据库时&#xff0c;游标在性能表现上存在着显著的差异。深入理解这些差异…...

LINUX 1

快照 克隆&#xff1a;关机状态下&#xff1a;长时间备份 uname 操作系统 -a 获取所有信息 绝对路径 相对路径 -a -l 列表形式查看 -h 查看版本 相对路径这个还没太搞懂 LS -L LL 简写 显示当前路径 pwd cd 切换到目录 clear 清屏 reboot 重启操作系统...

高效定位 Go 应用问题:Go 可观测性功能深度解析

作者&#xff1a;古琦 背景 自 2024 年 6 月 26 日&#xff0c;阿里云 ARMS 团队正式推出面向 Go 应用的可观测性监控功能以来&#xff0c;我们与程序语言及编译器团队携手并进&#xff0c;持续深耕技术优化与功能拓展。这一创新性的解决方案旨在为开发者提供更为全面、深入且…...

【Windows】win10系统安装.NET Framework 3.5(包括.NET 2.0和3.0)失败 错误代码:0×80240438

一、.NET3.5(包括.NET 2.0和3.0)安装方式 1.1 联网安装(需要联网,能访问微软,简单,很可能会失败) 1.2 离线安装-救急用(需要操作系统iso镜像文件,复杂,成功几率大) 二、联网安装 通过【控制面板】→【程序】→【程序和功能】→【启用或关闭Windows功能】 下载过程…...

蓝桥杯训练士兵

思路&#xff1a;其实每次就是要比较士兵单独训练的价格之和SUM与S的大小&#xff0c;如果 SUM大&#xff0c;那么就减去所有士兵都要训练的次数的最小值&#xff0c;SUM再更新一下&#xff0c;继续比较。 先对士兵的次数按从小到大的次序排序&#xff08;很重要&#xff09;&…...

Java基础-27-多态-多态好处和存在的问题

在面向对象编程&#xff08;OOP&#xff09;中&#xff0c;多态是一个非常重要的概念。它能够让我们用统一的方式处理不同类型的对象&#xff0c;提升代码的灵活性和可扩展性。Java 作为一种面向对象的编程语言&#xff0c;充分支持多态&#xff0c;并在实际开发中提供了巨大的…...

循环神经网络 - 简单循环网络

本文我们来学习和了解简单循环网络(Simple Recurrent Network&#xff0c;SRN)&#xff0c; SRN是一个非常简单的循环神经网络&#xff0c;只有一个隐藏层的神经网络。 简单循环神经网络&#xff0c;也常称为 Elman 网络&#xff0c;是最基本的循环神经网络&#xff08;RNN&am…...

Linux 企业项目服务器组建(附脚本)

一、架构概述​ 本方案旨在为企业搭建一套高效、安全的 Linux 服务器架构&#xff0c;包含一台 DNS 服务器&#xff0c;以及一台同时承载 FTP 和 Samba 服务的服务器&#xff0c;满足公司在域名解析、图片存储与共享、文件共享等方面的业务需求。​ 二、服务器部署​ DNS 服…...

Linux 2021韩顺平网课笔记:shell编程

基本介绍 Shell是一个命令行解释器&#xff0c;它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序&#xff0c;用户可以用Shell来启动、挂起、停止甚至是编写一些程序。 Shell脚本的执行方式 格式要求 脚本以 #!bin/bash 开头&#xff0c;表明以bashell…...

软考 中级软件设计师 考点知识点笔记总结 day09 操作系统进程管理

文章目录 4、操作系统基本原理4.1 、进程管理**4.1.1 、进程同步机制****4.1.2 、进程互斥机制****4.1.3 、信号量机制****4.1.4 、PV操作实现前驱操作****4.1.5 、死锁**4.1.6 、银行家算法 4、操作系统基本原理 进程管理 存储管理 文件管理 设备管理 微内核操作系统 操作系…...

大模型和AIGC同质化浪潮下的信息困局与破局之道,面向未来的认知革命

欢迎来到涛涛聊AI。看到网上太多雷同的内容有感后&#xff0c;让AI批判下AI。 一、技术趋同引发的信息生态危机 当前互联网正被海量AI生成内容淹没&#xff0c;这种现象的根源在于技术底层的高度同质化。全球主流大模型90%以上基于相同算法架构开发&#xff0c;采用近似的训练…...

⼆、Kafka客户端消息流转流程

这⼀章节将重点介绍Kafka的HighLevel API使⽤&#xff0c;并通过这些API&#xff0c;构建起Kafka整个消息发送以及消费的主线流程。 Kafka提供了两套客户端API&#xff0c;HighLevel API和LowLevel API。 HighLevel API封装了kafka的运⾏细节&#xff0c;使⽤起来⽐较简单&…...

es 3期 第28节-深入掌握集群组建与集群设置

#### 1.Elasticsearch是数据库&#xff0c;不是普通的Java应用程序&#xff0c;传统数据库需要的硬件资源同样需要&#xff0c;提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库&#xff0c;不是关系型数据库&#xff0c;不具备严格的ACID事务特性&#xff…...