在 Node.js 中用 Jasmine 测试 React 应用

Jasmine NPM 软件包最初仅设计用于对 Node.js 代码运行规范,但可以通过其他几个软件包将其用于运行 React 规范。本教程假设你正在使用 babel 编译代码,并使用了 React Testing Library 进行测试。我们还将使用 jsdom 为规范提供一个伪 HTML DOM。

还可以获得 此设置的完整工作示例

选择将要使用的包管理工具


基本设置

如果尚未安装,请安装以下软件包

$ yarn add --dev @babel/core \
                 @babel/register \
                 babel-preset-react-app \
                 cross-env \
                 jsdom \
                 jasmine
$ npm install --save-dev @babel/core \
                         @babel/register \
                         babel-preset-react-app \
                         cross-env \
                         jsdom \
                         jasmine

然后初始化 Jasmine

$ yarn run jasmine init
$ npx jasmine init

该命令将创建 spec/support/jasmine.json 并使用初始默认配置填充它。使用 Jasmine 初始化后,第一件事是创建一个帮助器,将 babel 注册到 require 链中。这将导致 TypeScript 文件在加载时被动态编译为 JavaScript。在 spec/helpers 目录中创建一个名为 babel.js 的新文件

require('@babel/register');

或者,如果使用 TypeScript

require('@babel/register')({
    "extensions": [".js", ".jsx", ".ts", ".tsx"]
});

我们需要通过添加 Babel 配置 来告诉 Babel 我们想要使用哪种 JavaScript,内容如下

{
  "presets": ["react-app"]
}

接下来,我们需要提供一个模拟的浏览器环境。使用以下内容在 spec/helpers 中创建 jsdom.js

import {JSDOM} from 'jsdom';

const dom = new JSDOM('<html><body></body></html>');
global.document = dom.window.document;
global.window = dom.window;
global.navigator = dom.window.navigator;

为了确保在运行任何规范之前加载这些文件,我们将编辑 spec/support/jasmine.json。我们需要在任何包含 TypeScript、JSX 或任何需要转译的代码的帮助程序之前加载 Babel 帮助程序,因此我们修改 jasmine.json,如下所示

"helpers": [
  "helpers/babel.js",
  "helpers/**/*.js"
],

或者,如果使用 Typescript

"helpers": [
  "helpers/babel.js",
  "helpers/**/*.{js,ts}"
],

接下来,设置 package.json 中的 test 脚本以运行 Jasmine

  "scripts": {
    "test": "cross-env NODE_ENV=test jasmine",

处理 CSS 和图像导入

React 代码导入 CSS 或图像文件是很常见的。通常在构建时会解决这些导入,但在 Node 中运行规范时会产生错误。为了解决此问题,我们添加另一个软件包

$ yarn add --dev ignore-styles
$ npm install --save-dev ignore-styles

并将以下代码放入 spec/helpers/exclude.js 中。

import 'ignore-styles';

可选:规范文件模式配置

你可能还需要更改 Jasmine 查找规范文件的方式。Jasmine 通常在以 .spec.js 结尾的名称结尾的 spec 目录中查找文件,但在 React 项目中,常见做法是将规范文件放在与它们测试的代码相同的目录中,并使用以 .test.js 结尾的名称来命名它们。如果你希望遵循该约定,请相应更改 spec/support/jasmine.json 中的 spec_dirspec_fileshelpers 设置

  "spec_dir": "src",
  "spec_files": [
    "**/*.test.*"
  ],
  "helpers": [
    "../spec/helpers/babel.js",
    "../spec/helpers/**/*.js"
  ],

或者,对于 TypeScript

  "spec_dir": "src",
  "spec_files": [
    "**/*.test.*"
  ],
  "helpers": [
    "../spec/helpers/babel.js",
    "../spec/helpers/**/*.{js,ts}"
  ],

设置 React 测试实用程序

我们需要一种呈现 React 组件和检查结果的方法。有几个提供该功能的实用程序库。最受欢迎的是 React Testing Library

react-testing-library 的设置非常简单。我们需要做的就是确保安装了 @testing-library/react 软件包。如果你使用较新版本的 create-react-app 来初始化你的应用程序,那么它可能已经存在。如果没有,请安装它

$ yarn add --dev @testing-library/react
$ npm install --save-dev @testing-library/react

请参阅 React Testing Library 文档 了解更多信息。相关的 jasmine-dom 匹配器库也可能很有用。

请注意,大部分 React Testing Library 文档都是为 Jest 编写的,因此在 Jasmine 中使用之前,代码示例需要进行一些翻译。尤其是

在将代码示例从 Jest 翻译到 Jasmine 时,你可能会发现参考 Jasmine 教程Jasmine 附带的匹配器列表jasmine-dom 附带的匹配器列表 很有用。

总结

你已经准备好了。 编写你的规范 并运行它们

$ yarn test
$ npm test