配合 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_fileshelpers 的前缀。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();