在不使用模块的情况下跨多个测试在 Jest 中配置 jsdom
Configuring jsdom in Jest across multiple tests without using modules
我想在无法导出模块的环境中测试脚本。我已经安装了 Jest 版本 23.1.0,并且我的 package.json
文件中没有其他软件包。
使用 jsdom 'old' api 我想出了一个按预期工作的解决方案:
script.js
var exVar = "test";
script.test.js
const jsdom = require('jsdom/lib/old-api.js');
test('old jsdom api config', function(done) {
jsdom.env({
html: "<html><body></body></html>",
scripts: [__dirname + "/script.js"],
done: function (err, window) {
expect(window.exVar).toBe("test");
done();
}
});
});
然而,对于这个实现,我必须为每个测试重新编写配置,因为看起来 jsdom 配置每次都被重新编写。
我试过的
到目前为止,我已经尝试了 运行 这个配置:
const jsdom = require('jsdom/lib/old-api.js');
jsdom.env({
html: "<html><body></body></html>",
scripts: [__dirname + "/script.js"],
done: function (err, window) {
console.log('end');
}
});
通过此测试:
test('old jsdom api config', function(done) {
expect(window.exVar).toBe("test");
done();
});
以不同的方式:在 beforeAll
内部,在脚本中 link 通过 setupFiles
或通过 setupTestFrameworkScriptFile
在 Jest 配置对象中编辑,但仍然没有任何效果。
也许我可以按照 docs 中的建议扩展 jest-environment
,但我不知道我应该使用的语法,也不知道如何 link 这个文件到测试。
感谢我的同事 Andrea Talon 我找到了一种使用相同设置进行不同测试的方法(至少在同一文件中)使用 'Standard API'(不是 'old API').
这是完整的测试文件。
const {JSDOM} = require("jsdom")
const fs = require("fs")
// file to test
const srcFile = fs.readFileSync("script.js", { encoding: "utf-8" })
// the window
let window
describe('script.js test', () => {
beforeAll((done) => {
window = new JSDOM(``, {
runScripts: "dangerously"
}).window
const scriptEl = window.document.createElement("script")
scriptEl.textContent = srcFile
window.document.body.appendChild(scriptEl)
done()
})
test('variable is correctly working', (done) => {
expect(window.exVar).toBe("test");
done()
})
})
其他设置
为了加载多个脚本,我创建了这个接受脚本数组的函数:
function loadExternalScripts (window, srcArray) {
srcArray.forEach(src => {
const scriptEl = window.document.createElement("script")
scriptEl.textContent = src
window.document.body.appendChild(scriptEl)
});
}
因此,我可以通过在文件顶部声明它们来加载它们,而不是将每个脚本附加到 window
变量,如下所示:
// files to test
const jQueryFile = fs.readFileSync("jquery.js", { encoding: "utf-8" })
const srcFile = fs.readFileSync("lib.js", { encoding: "utf-8" })
然后在 beforeAll
函数中我可以像这样加载它们:
loadExternalScripts(window, [jQueryFile, srcFile])
我想在无法导出模块的环境中测试脚本。我已经安装了 Jest 版本 23.1.0,并且我的 package.json
文件中没有其他软件包。
使用 jsdom 'old' api 我想出了一个按预期工作的解决方案:
script.js
var exVar = "test";
script.test.js
const jsdom = require('jsdom/lib/old-api.js');
test('old jsdom api config', function(done) {
jsdom.env({
html: "<html><body></body></html>",
scripts: [__dirname + "/script.js"],
done: function (err, window) {
expect(window.exVar).toBe("test");
done();
}
});
});
然而,对于这个实现,我必须为每个测试重新编写配置,因为看起来 jsdom 配置每次都被重新编写。
我试过的
到目前为止,我已经尝试了 运行 这个配置:
const jsdom = require('jsdom/lib/old-api.js');
jsdom.env({
html: "<html><body></body></html>",
scripts: [__dirname + "/script.js"],
done: function (err, window) {
console.log('end');
}
});
通过此测试:
test('old jsdom api config', function(done) {
expect(window.exVar).toBe("test");
done();
});
以不同的方式:在 beforeAll
内部,在脚本中 link 通过 setupFiles
或通过 setupTestFrameworkScriptFile
在 Jest 配置对象中编辑,但仍然没有任何效果。
也许我可以按照 docs 中的建议扩展 jest-environment
,但我不知道我应该使用的语法,也不知道如何 link 这个文件到测试。
感谢我的同事 Andrea Talon 我找到了一种使用相同设置进行不同测试的方法(至少在同一文件中)使用 'Standard API'(不是 'old API').
这是完整的测试文件。
const {JSDOM} = require("jsdom")
const fs = require("fs")
// file to test
const srcFile = fs.readFileSync("script.js", { encoding: "utf-8" })
// the window
let window
describe('script.js test', () => {
beforeAll((done) => {
window = new JSDOM(``, {
runScripts: "dangerously"
}).window
const scriptEl = window.document.createElement("script")
scriptEl.textContent = srcFile
window.document.body.appendChild(scriptEl)
done()
})
test('variable is correctly working', (done) => {
expect(window.exVar).toBe("test");
done()
})
})
其他设置
为了加载多个脚本,我创建了这个接受脚本数组的函数:
function loadExternalScripts (window, srcArray) {
srcArray.forEach(src => {
const scriptEl = window.document.createElement("script")
scriptEl.textContent = src
window.document.body.appendChild(scriptEl)
});
}
因此,我可以通过在文件顶部声明它们来加载它们,而不是将每个脚本附加到 window
变量,如下所示:
// files to test
const jQueryFile = fs.readFileSync("jquery.js", { encoding: "utf-8" })
const srcFile = fs.readFileSync("lib.js", { encoding: "utf-8" })
然后在 beforeAll
函数中我可以像这样加载它们:
loadExternalScripts(window, [jQueryFile, srcFile])