当我想用命令npm run test
运行我的项目时,我会得到下面的错误。是什么原因造成的?
FAIL
● Test suite failed to run
SecurityError: localStorage is not available for opaque origins at Window.get localStorage [as localStorage] (node_modules/jsdom/lib/jsdom/browser/Window.js:257:15)
at Array.forEach (<anonymous>)
如果您使用http://localhost
前缀访问应用程序,则需要将您的jest配置(在jest.config.js
中(更新为
"jest": {
"verbose": true,
"testURL": "http://localhost/"
}
如果您还没有任何jest配置,只需将该配置包含在package.json
中即可。例如:
{
"name": "...",
"description": "...",
...
"jest": {
"verbose": true,
"testURL": "http://localhost/"
}
}
或在jest.config.js
:中
module.exports = {
verbose: true,
testURL: "http://localhost/",
...
}
或者如果您配置了projects
:
module.exports = {
verbose: true,
projects: [{
runner: 'jest-runner',
testURL: "http://localhost/",
// ...
}]
}
对于package.json
中的配置,在jest v28中删除了testURL。现在您应该使用testEnvironmentOptions来传递url选项,如下所示:
"jest": {
"verbose": true,
"testEnvironmentOptions": {
"url": "http://localhost/"
}
}
我刚刚在一个大型monoreo中遇到了这个问题(在单元测试中,否则就不需要jsdom(。在我们的jest.config.js
(或等效的package.json
(中明确设置以下内容也缓解了这个问题:
module.exports = {
testEnvironment: 'node'
}
更新:正如下面提到的Nicolas(谢谢!(,如果你不使用任何配置文件,你也可以添加以下标志:
jest --testEnvironment node
# or
jest --env=node
您必须指定要使用的环境(--env
(。
在package.json
中运行jest
命令时,应指定环境(jsdom
或node
(。例如:
"scripts": {
"jest": "jest --env=node --colors --coverage test",
"test": "npm run jest"
},
这应该对你有用!
如果您使用的是jsdom,请确保包含url。
签出jsdom存储库的简单选项。https://github.com/jsdom/jsdom#simple-选项
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const dom = new JSDOM(`...`, { url: "https://example.org/" });
我遇到了同样的问题,手动安装jest-environment-jsdom
版本28(基于这个GitHub线程(解决了这个问题。
当我将jest更新到v28.0.3时,出现了问题。似乎在28.0.0版本中,他们取消了testUrl的绑定,并引入了一个具有默认值的属性url的对象testEnvironmentOptionshttp://localhost/"。
弃用警告:
选项";testURL";被替换为通过"testEnvironmentOptions.url";。
请更新您的配置。
配置文档:https://jestjs.io/docs/configuration
请在此处查看PR:https://github.com/facebook/jest/pull/10797
然而,当我更新jest环境jsdom并在jest.config.js中为其设置testEnvironment时,我的问题就消失了。
module.exports = {
...
testEnvironment: 'jest-environment-jsdom',
...
}
评分最高的答案中关于将testURL: "http://localhost"
添加到我的Jest配置中的建议对我不起作用。然而,这个来自jsdom GitHub讨论的建议,即在创建jsdom对象时传入URL,对我起了作用。
const url = 'http://localhost';
const dom = new JSDOM('<!DOCTYPE html><html><body></body></html>', { url });
对我来说,这是通过升级到"jest"来解决的:"^24.9.0",
要解决Jest SecurityError: localStorage
错误,您需要将jest: { ... }
部分添加到package.json文件
{
"name": "...",
"version": "..",
"main": "..",
"description": "...",
...
"jest": { "verbose": true, "testURL": "http://localhost/" },
}
这听起来可能很傻,但对我来说,问题是因为我错误地安装了带有npm update
的随机包。我先运行npm install
,然后运行npm update
,但我应该只运行npm install
。我通过删除node_modules
目录并再次运行npm install
解决了这个问题。
使用React JS时不需要做任何事情。创建react应用程序的默认行为是放置JEST并设置测试环境。运行以下时,它开始显示测试成功或失败,
npm测试
如果您想要测试覆盖率,只需将以下内容添加到package.json文件中
"测试":"反应脚本测试——覆盖率"现在你的package.json"脚本"看起来像
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test --coverage",
"eject": "react-scripts eject"
}
当enzyme
与jest
集成时,我突然想到了这一点。Github问题讨论建议与上述相同,即添加
"testURL": "http://localhost/"
到笑话配置。然而,很高兴知道这也是由酶触发的。对我来说,这是React v15和v15适配器。
我有同样的问题,将其放在我的package.json
文件中对我有效:
"jest": {
"verbose": true,
"testURL": "http://localhost/"
}
如果您正在使用jsdom,则必须更改测试设置,如下所示:
const { JSDOM } = require('jsdom');
const jsdom = new JSDOM('<!doctype html><html><body></body></html>', {
url: 'http://localhost/',
});```