Jest SecurityError:localStorage不可用于不透明的源



当我想用命令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命令时,应指定环境(jsdomnode(。例如:

"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"

}

enzymejest集成时,我突然想到了这一点。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/',
});```

最新更新