使用 Enzyme 与 JSDOM
JSDOM 是一个基于 JavaScript 的无头浏览器,可用于创建逼真的测试环境。
由于 enzyme 的 mount
API 需要 DOM,因此如果您不在浏览器环境(例如 Node 环境)中,则需要 JSDOM 才能使用 mount
。
为了获得最佳的 enzyme 体验,建议您在第一次加载 React 之前将文档加载到全局作用域中。非常重要的是,以下脚本必须在运行 React 代码之前运行。
因此,像下面这样的独立脚本通常是一个好方法
jsdom v10~
:
/* setup.js */
const { JSDOM } = require('jsdom');
const jsdom = new JSDOM('<!doctype html><html><body></body></html>');
const { window } = jsdom;
function copyProps(src, target) {
Object.defineProperties(target, {
...Object.getOwnPropertyDescriptors(src),
...Object.getOwnPropertyDescriptors(target),
});
}
global.window = window;
global.document = window.document;
global.navigator = {
userAgent: 'node.js',
};
global.requestAnimationFrame = function (callback) {
return setTimeout(callback, 0);
};
global.cancelAnimationFrame = function (id) {
clearTimeout(id);
};
copyProps(window, global);
以下也是 jsdom 旧 API 的示例。
jsdom ~<v10
:
/* setup.js */
const { jsdom } = require('jsdom');
global.document = jsdom('');
global.window = document.defaultView;
global.navigator = {
userAgent: 'node.js',
};
function copyProps(src, target) {
const props = Object.getOwnPropertyNames(src)
.filter((prop) => typeof target[prop] === 'undefined')
.reduce((result, prop) => ({
...result,
[prop]: Object.getOwnPropertyDescriptor(src, prop),
}), {});
Object.defineProperties(target, props);
}
copyProps(document.defaultView, global);
describeWithDOM
API 以及在每次测试后清除文档
在 enzyme 的早期版本中,有一个公共的 describeWithDOM
API,它会在每次测试之前将一个新的 JSDOM 文档加载到全局命名空间中,确保测试是确定性的并且没有副作用。
这种方法不再推荐。React 的源代码对它运行的环境做出了几个假设,其中之一是它在“require 时间”找到的 global.document
将是它唯一需要担心的文档。因此,这种类型的“重新加载”最终会导致比它阻止的更多问题。
但是,重要的是要确保使用全局 DOM API 的测试没有泄漏的副作用,这些副作用可能会改变其他测试的结果。在有更好的选择之前,这将由您来确保。
JSDOM + Mocha
在使用 JSDOM 进行测试时,上面的 setup.js
文件需要在测试套件运行之前运行。如果您使用的是 mocha,则可以使用 --require
选项从命令行执行此操作
mocha --require setup.js --recursive path/to/test/dir
Node.js 兼容性
Jsdom 需要 node 4 或更高版本。因此,如果您想将其与 mount
一起使用,则需要确保您的机器上安装了 node 4 或 iojs。如果您必须使用旧版本的 Node,您可能想尝试使用基于浏览器的测试运行器,例如 Karma。
在 Node 版本之间切换
有时您可能需要在不同版本的 Node 之间切换,您可以使用名为 nvm
的 CLI 工具快速切换 Node 版本。
要安装 nvm
,请使用来自 http://nvm.sh 的 curl 脚本,然后
nvm install 4
现在您的机器将运行 Node 4。您可以使用 nvm use
命令在两个环境之间切换
nvm use 0.12
nvm use 4