Jasmine 框架教程:单元测试示例

⚡ 智能摘要

Jasmine 是行为驱动型的 Java这是一个脚本测试框架,它使用 describe 块运行 Node.js 单元测试,无需浏览器或 DOM,它通过规范和期望匹配器来验证每个导出的函数是否按文档所述运行。

  • 🔘 框架角色: 茉莉花测试任何 Java无需浏览器、DOM 或辅助库的脚本。
  • ☑️ 环境设置: 安装模块,运行 jasmine init,然后检查 spec/support/jasmine.json。
  • 规格模式: describe 命名一个套件,它定义了一个规范,expect 断言结果。
  • 🧪 匹配器: toBe、toEqual、toContain、toThrow 和 toHaveBeenCalled 涵盖了大多数断言。
  • 🛠️ 现代跑者: 维护良好的 jasmine 包取代了不再维护的 jasmine-node 模块。
  • 📊 框架选择: Jasmine 提供断言和间谍功能,而 Jest 则增加了并行运行和快照功能。

Jasmine框架单元测试Node.js应用程序教程

什么是 JasmineJS?

Jasmine 是一个开源且最流行的 Java脚本库测试框架来测试任何类型的 Java脚本应用程序。Jasmine 遵循行为驱动开发 (BDD) 程序,以确保每一行 Java脚本语句已经过适当的单元测试。

Jasmine 框架用于什么?

测试是任何应用程序的关键要素。对于 Node.js 单元测试,可用的测试框架是 Jasmine。在 2000 年代初期,也曾出现过一个用于测试的框架。 JavaScript 名为 JsUnit 的应用程序。 Later 该框架已升级,现在称为 Jasmine。

Jasmine 有助于自动化 单元测试这已成为开发过程中一项相当关键的做法ping 并部署现代网络应用程序。

在本 Jasmine 教程中,您将学习如何使用 Jasmine 设置您的环境以及如何为您的第一个 Node.js 应用程序运行 Jasmine 测试。

Jasmine 用于测试 Node.js 应用程序

茉莉花是 行为驱动开发(BDD) 测试框架 Java脚本。确实如此 不会 依赖于浏览器、DOM 或任何 Java脚本框架。因此,它适用于网站。 Node.js 项目,或任何其他地方 Java脚本可以运行。要开始使用 Jasmine,您需要先下载并安装必要的 Jasmine 模块。

如何设置 Jasmine 测试环境

接下来,在本 Jasmine Node.js 教程中,您需要初始化环境并检查 Jasmine 配置文件。以下步骤展示了如何在您的环境中设置 Jasmine。

步骤1) 安装 NPM 模块
您需要 安装 NPM jasmine 模块用于在 Node 应用程序中使用 Jasmine 框架。要安装 jasmine-node 模块,请运行以下命令。

npm install jasmine-node

版本说明(2026): 上述历史命令仍然有效,但是 茉莉节点 该模块处于维护模式,并且捆绑了 Jasmine 1.3,因此仅建议在旧项目中保留。新的 Node.js 项目会安装维护后的版本。 Jasmine CLI 作为开发依赖项,并通过 npx 调用它:

npm install --save-dev jasmine
npx jasmine init

茉莉花 6.x 是当前的主要版本,支持 Node.js 20、22 和 24,Node.js 24 是 2026 年的活跃 LTS 版本。

步骤2) 初始化 Jasmine 环境
初始化项目——通过此操作,Jasmine 会为您创建一个 spec 目录和一个配置 JSON 文件。spec 目录用于存储所有测试文件。这样,Jasmine 就能知道所有测试文件的位置,并据此执行它们。 JSON 该文件用于存储有关 Jasmine 的特定配置信息。

要初始化 Jasmine 环境,请运行以下命令

jasmine init

步骤3) 检查您的配置文件。
配置文件将以 jasmine.json 的形式存储在 spec/support 文件夹中。此文件列举了您希望 Jasmine 运行器包含的源文件和 spec 文件。

下面截图显示了 Jasmine 的 jasmine.json 文件的典型示例。

spec 支持文件夹中的 Jasmine 配置文件显示了 spec 目录和 spec_files。

  1. 注意这里指定了 spec 目录。如前所述,当 jasmine 运行时,它会搜索此目录中的所有测试。
  2. 接下来要注意的是 spec_files 参数——这表示无论创建什么测试文件都应附加“spec”关键字。

配置说明: 在 Jasmine 6.x 中,同一个文件也接受 佣工,它在每个规范之前加载一次,并且 ENV 包含诸如 random 和 stopSpecOnExpectationFailure 等块保存选项。默认的 spec_files 通配符是 **/*[sS]spec.?(m)js并且可以通过以下方式传递不同的文件: –configJASMINE_CONFIG_PATH 变量。

接下来在本 Jasmine 框架教程中,我们将学习如何使用 Jasmine 测试 Node.js 应用程序。

如何使用 Jasmine 测试 Node.js 应用程序

为了使用 Jasmine 对 Node.js 应用程序进行单元测试,需要遵循一系列步骤。

在下面的示例中,我们将定义一个用于计算两个数字之和的模块,该模块需要进行测试。然后,我们将定义一个单独的代码文件来编写测试代码,并使用 Jasmine 对 Add 函数进行相应的测试。

步骤1) 定义需要测试的代码。我们将定义一个函数,它将添加两个数字并返回结果。此代码将写入名为“Add.js”的文件中。

下面的屏幕截图显示了完成的 Add.js 模块,其下方以文本形式重复显示了相同的代码。

Add.js 模块导出 AddNumber 函数,该函数返回两个参数之和。

var exports=module.exports={};
exports.AddNumber=function(a,b)
{
return a+b;
};

Code 说明

  1. “exports”关键字用于确保该文件中定义的功能实际上可以被其他文件访问。
  2. 然后我们定义一个名为“AddNumber”的函数。此函数定义为采用 2 个参数 a 和 b。该函数被添加到模块“exports”,以使该函数成为可由其他应用程序模块访问的公共函数。
  3. 我们最终让我们的函数返回参数的附加值。

步骤2) 接下来,我们需要定义 Jasmine 测试代码,它将用于测试 Add.js 文件中的“Add”函数。以下代码需要放在一个名为 `.jasmine.js` 的文件中。 添加 spec.js。

注意:需要在测试文件中添加“spec”一词,以便 Jasmine 可以检测到它。

下面的屏幕截图显示的是在编辑器中打开的同一个 spec 文件。

add-spec.js 文件包含一个 describe 套件和一个 it 规范,其中断言 AddNumber 返回 11。

var app=require("../Add.js");
describe("Addition",function(){
it("The function should add 2 numbers",function() {
var value=app.AddNumber(5,6);
expect(value).toBe(11);
});
});

Code 说明

  1. 我们需要首先包含我们的 Add.js 文件,以便我们可以在此文件中测试“AddNumber”函数。
  2. 我们现在正在创建测试模块。测试模块的第一部分是描述一种方法,该方法基本上为我们的测试提供了一个名称。在本例中,我们的测试名称是“Addition”。
  3. 下一步是使用“it”方法对我们的测试进行描述。
  4. 现在我们调用 AddNumber 方法并传入两个参数 5 和 6。这两个参数将传递给 Add.js 文件中的 AddNumber 方法。返回值随后存储在名为 value 的变量中。
  5. 最后一步是进行比较或进行实际测试。由于我们期望 AddNumber 函数返回的值为 11,因此我们使用 expect(value).toBe(期望值) 方法来定义它。

输出

  1. 为了运行测试,需要运行命令 jasmine。
  2. 下面的截图显示,Jasmine 命令运行后,它会检测到名为 add-spec.js 的测试文件,并执行该测试。如果测试中出现任何错误,也会相应地显示出来。

jasmine 命令的控制台输出报告了已执行的 add-spec 测试

Add 示例仅使用了一个匹配器,但 Jasmine 提供了一整套匹配器。下表列出了几乎涵盖您将编写的所有断言的匹配器。

你会最常用到的茉莉花火柴

匹配器是 expect() 之后的比较。在任何匹配器之前链式 .not 可以反转它,例如 expect(value).not.toBe(11)。

匹配器 检查内容 典型用途
严格意义上的同一性,与 === 的比较相同 expect(value).toBe(11)
等于 对象和数组的深度相等性 expect(user).toEqual({id: 1})
包含 数组或字符串中的成员 expect(files).toContain('add-spec.js')
待定义 该值并非未定义。 expect(app.AddNumber).toBeDefined()
包装后的函数会引发错误。 expect(callAdd).toThrow()
被呼唤 至少有一次提到了间谍。 expect(logger.write).toHaveBeenCalled()

两个习惯能让失败信息更易读。`toBe` 只用于基本类型和同名引用,因为内容相同的两个对象永远不会是 `===`。`toEqual` 用于结构体,并且当参数与调用本身同样重要时,可以添加 `toHaveBeenCalledWith`。

茉莉花中的设置、拆除和间谍

真正的套件需要共享状态和备份,以便于协作速度较慢的开发人员使用。Jasmine 无需任何额外软件包即可提供这两项功能。

  • beforeEach 和 afterEach 在 describe 代码块中,在每个 spec 之前和之后运行,这是重建 fixtures 的自然位置。
  • 一切之前和一切之后 整个街区只需运行一次,因此请将它们留给开通连接等昂贵的工作。
  • spyOn(object, 'method') 用一个方法替换一个实际方法 tracking double;添加 .and.returnValue() 来控制它的返回值。
  • jasmine.createSpy('name') 为没有对象可附加的回调函数构建一个独立的 double 对象。
  • 异步规范 可以声明为异步函数并使用 await 等待,可以返回一个 Promise,或者可以接受一个必须只调用一次的 done 回调函数。

间谍会在测试用例之间重置,因此测试套件永远不会将桩方法泄露到下一个测试中。这种隔离机制使得失败的测试用例指向单个缺陷而不是一系列缺陷,这与之前描述的原则相同。 单元测试 基本面。

茉莉花 vs 摩卡 vs 杰斯特

Jasmine是三大主流框架之一。 Java脚本测试,最终的选择通常取决于你想拥有多少线路。

方面 Jasmine 摩卡
断言 内置 添加,通常是 Chai 内置
间谍和嘲讽 内置 添加,通常是诗乃 内置
执行 串行 串行 跨流程并行
快照 没有 没有
公共住宅 Angular,纯 Node.js 灵活的Node.js技术栈 React 和现代打包器

Pick 摩卡 当你想构建自己的断言和模拟堆栈时,以及 在并行运行中,覆盖率和快照比配置控制更重要。Jasmine 仍然是最轻量级且功能齐全的选择,这也是它仍然很受欢迎的原因。 自动化测试 套房。

常见问题

Jasmine 会读取 spec_dir 作为前缀,然后读取 spec_files 中列出的所有 glob 模式,因此只有匹配的文件才会运行。以感叹号开头的路径会被排除,并且辅助函数会在 spec 之前加载一次,以注册共享设置。

将规范声明为异步并等待调用、返回一个 Promise 或接受一个 done 回调。 异步指南 警告:done 必须只执行一次,否则失败将落在错误的规范上。

在运行器后传递路径或通配符,例如 `npx jasmine spec/appSpec.js`。`--filter` 标志接受与描述名称匹配的模式,这样在处理单个测试套件时可以快速获得反馈。

茉莉节点 该软件包处于维护模式,仍然捆绑了 Jasmine 1.3,并将 Node.js 10 和 12 列为当前版本。官方 Jasmine 软件包 tracks 框架并支持 Node.js 版本。

在规范名称前加上 x 前缀(例如 xit 或 xdescribe),Jasmine 会将其报告为待处理状态。在规范名称前加上 f 前缀(例如 fit 或 fdescribe),则只有被选中的规范才会运行。提交之前,请移除这两个前缀。

AI助手能在几秒钟内根据现有模块生成描述块、匹配器和边界情况,并标记间歇性失败的测试套件。但每个生成的规范仍然需要审核,因为对错误行为的自信断言会掩盖缺陷。

GitHub 副驾驶 它能实时补全规范主体,其代理模式还能在重构后发起拉取请求来修复损坏的规范。您可以将差异视为提案,并自行运行测试套件。

Angular 仍然会搭建 Jasmine 规范的脚手架,并且 专业版trac器 在 Jasmine 被归档之前,团队一直使用 Jasmine 作为默认框架。现在,团队会将 Jasmine 与 Karma(用于浏览器)结合使用,或者将浏览器流程迁移到其他平台。 Cypress 和剧作家。

总结一下这篇文章: