配合 Node 使用 Jasmine
jasmine
模块是一种命令行界面,支持在 Node.js 下运行 Jasmine 规格。Jasmine 5.x 支持 Node 版本 18、20 和 22。(不支持奇数版本的 Node,但许多版本均可正常使用。)
安装
您可以在项目中使用 npm 本地安装 Jasmine
npm install --save-dev jasmine
借助上述本地安装,您可以使用 npx jasmine ...
命令来调用 CLI 工具。
您还可以选择全局安装 jasmine,以便在不使用 npx
的情况下调用 CLI 工具。然而,此方法不可取,因为难以使全局安装的 jasmine
版本与使用它的各个项目保持同步。
npm install -g jasmine
初始化项目
通过创建规格目录并为您配置 json,来针对 Jasmine 初始化项目
npx jasmine init
生成范例
生成示例规范和源文件
npx jasmine examples
此时,您应该能够 编写您的第一个套件。
配置
自定义 spec/support/jasmine.json
,列出您希望 Jasmine 运行器包含的源文件和规格文件。您可以使用 dir glob 字符串。
以 !
开头的路径会被排除,例如 !**/*nospec.js
。
spec_dir
会被用作所有 spec_files
和 helpers
的前缀。Helpers 会在所有规格之前执行一次。有关一些 Helpers 的示例,请查看 React 教程。
{
// Spec directory path relative to the current working dir when jasmine is executed.
// The value "" represents the current working directory.
"spec_dir": "spec",
// Array of filepaths (and globs) relative to spec_dir to include and exclude
"spec_files": [
"**/*[sS]pec.?(m)js",
"!**/*nospec.js"
],
// Array of filepaths (and globs) relative to spec_dir to include before jasmine specs
"helpers": [
"helpers/**/*.?(m)js"
],
// Configuration of the Jasmine environment
// "env" is optional, as are all of its properties.
"env": {
// Whether to fail a spec that ran no expectations
"failSpecWithNoExpectations": false,
// Stop execution of a spec after the first expectation failure in it
"stopSpecOnExpectationFailure": false,
// Stop execution of the suite after the first spec failure
"stopOnSpecFailure": false,
// Run specs in semi-random order
"random": false
}
}
您还可以通过使用 --config
命令行参数或 JASMINE_CONFIG_PATH
环境变量指定不同的配置文件,如下所示。配置文件可以是 .json
或 .js
。.js
配置文件应该是一个模块,其默认导出项是一个配置对象。
jasmine JASMINE_CONFIG_PATH=relative/path/to/your/jasmine.json
jasmine --config=relative/path/to/your/jasmine.json
运行规格
设置好 jasmine.json
后,您可以通过从项目的根目录运行 jasmine
(或如果您在本地安装了它,则运行 npx jasmine
)来执行所有规格。
如果您只想运行一个规范或只运行在与特定glob模式匹配的文件中的规范,您可以按照如下方式进行
npx jasmine spec/appSpec.js
npx jasmine "**/model/**/critical/**/*Spec.js"
筛选规范
仅执行文件名与给定 glob 匹配的那些规范
npx jasmine "spec/**/critical/*Spec.js"
或单个文件
npx jasmine spec/currentSpec.js
或仅执行名称与特定正则表达式匹配的那些规范
npx jasmine --filter "adapter21*"
(其中规范的名称是传递给describe()
的第一个参数)
使用 ES 模块
Jasmine 使用动态导入加载您的代码,该代码应该同时兼容ES 模块和CommonJS 模块。这意味着如果脚本名称以.mjs
结尾,或者包含该文件的包的package.json
中包含"type": "module"
,则该脚本将被加载为 ES 模块。
默认配置应该对几乎所有 CommonJS 项目以及使用 ES 模块的项目都适用。但如果需要,您可以通过将"jsLoader": "require"
添加到 Jasmine config 文件中来配置 Jasmine 以使用require
加载脚本。如果您有使用"jsLoader": "require"
的代码,但如果不使用该选项,代码就无法运行,请告诉我们。即使将jsLoader
设置为"require"
,名称以.mjs
结尾的文件仍将通过动态导入加载。
CLI 选项
JASMINE_CONFIG_PATH=
指定配置文件的相对路径或绝对路径。可用作选项或设置为环境变量。
JASMINE_CONFIG_PATH=spec/config/jasmine.json jasmine
npx jasmine --config=spec/config/jasmine.json
--no-color
关闭规范输出中的颜色
npx jasmine --no-color
--filter=
只运行与给定字符串匹配的规范
npx jasmine --filter="a spec name"
--fail-fast
在第一次期望失败或其他错误后停止执行套件
npx jasmine --fail-fast=true
--random=[true|false]
告诉 jasmine 按半随机顺序运行规范,或不按这种顺序运行,覆盖jasmine.json
npx jasmine --random=true
--seed=
如果启用了随机化,则设置随机化种子
npx jasmine --seed=4321
--reporter=
设置默认报表。该值必须是对其默认导出为报表构造函数的模块的有效导入说明符。
npm i --save-dev jasmine-ts-console-reporter
npx jasmine --reporter=jasmine-ts-console-reporter
使用库
如果您希望更精细地控制配置,Jasmine 也可以用作项目中的库。这样一来,您可以加载多个配置文件或以不同方式控制配置。
const Jasmine = require('jasmine');
const jasmine = new Jasmine();
从文件或对象加载配置
jasmine.loadConfigFile('spec/support/jasmine.json');
jasmine.loadConfig({
spec_dir: 'spec',
spec_files: [
'appSpec.js',
'requests/**/*[sS]pec.js',
'utils/**/*[sS]pec.js'
],
helpers: [
'helpers/**/*.js'
]
});
自定义完成处理程序
默认情况下,一旦套件完成运行,Jasmine 将导致节点进程退出。如果套件的 总体状态 为 'passed'
,退出代码将为 0;在所有其他情况下,为非零。如果您希望以不同的方式处理完成,可以将 Jasmine 实例的 exitOnCompletion
属性设置为 false
,并使用从 execute
返回的 promise。这通常用于向像 grunt 这样的任务运行器发送状态消息。
jasmine.exitOnCompletion = false;
const result = await jasmine.execute();
if (result.overallStatus === 'passed') {
console.log('All specs have passed');
} else {
console.log('At least one spec has failed');
}
报告器
如果没有添加其他报告器,则会包含一个 ConsoleReporter。您可以使用 configureDefaultReporter
配置默认报告器。示例中显示了默认值。
jasmine.configureDefaultReporter({
// The `timer` passed to the reporter will determine the mechanism for seeing how long the suite takes to run.
timer: new jasmine.jasmine.Timer(),
// The `print` function passed the reporter will be called to print its results.
print: function() {
process.stdout.write(arguments);
},
// `showColors` determines whether or not the reporter should use ANSI color codes.
showColors: true
});
您可以使用 addReporter
添加自定义报告器。如果您通过 addReporter
添加报告器,则不会添加默认 ConsoleReporter。可以添加多个报告器。
const CustomReporter = require('./myCustomReporter');
jasmine.addReporter(new CustomReporter());
运行测试
调用 execute
将运行规范。
jasmine.execute();
execute
可以根据需要以一个规范文件路径列表为参数进行调用,以相对于当前工作目录执行,还可以以一个字符串为参数,按规范名称进行过滤。
jasmine.execute(['fooSpec.js'], 'a spec name');
使用该 JavaScript 库的一个简单示例
const Jasmine = require('jasmine');
const jasmine = new Jasmine();
jasmine.loadConfigFile('spec/support/jasmine.json');
jasmine.configureDefaultReporter({
showColors: false
});
jasmine.execute();