Jest SecurityError:localStorage 不适用于不透明的来源

Posted

技术标签:

【中文标题】Jest SecurityError:localStorage 不适用于不透明的来源【英文标题】:Jest SecurityError: localStorage is not available for opaque origins 【发布时间】:2019-01-04 08:47:54 【问题描述】:

当我想使用命令 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:port... 一样访问它? 这是测试运行器的问题,@DavidR,他有问题 >>>npm run test @MartinChaov 是的,我知道。我想看看他的回复,以检查他的jest 配置是否有问题:-) 我自己刚开始遇到这个......我在代码中根本没有使用本地存储。你的代码也使用 ts-jest 吗? @k2snowman69 请检查我的回答并发表您的评论。 【参考方案1】:

如果您使用 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/",

    // ...
  ]

【讨论】:

是的,这对我有用......虽然我不太明白为什么我需要这个,也不明白为什么它在最新升级之前工作 这在jest github页面中讨论:github.com/facebook/jest/issues/6766 你也可以在你的 npm 脚本中使用 cli 选项:jest --testURL=\"http://localhost\"。如果您因为其他环境(对我来说是反应脚本)而无法设置全局笑话配置,则很有用。 我正在研究原生反应。即使对我来说testUrl 也有效。【参考方案2】:

我刚刚在一个大型 monorepo 中出现了这个问题(在单元测试中,否则就不需要 jsdom)。在我们的jest.config.js(或package.json 等效项)中显式设置以下内容也缓解了这个问题:

module.exports = 
  testEnvironment: 'node'

更新:正如 Nicolas 在下面提到的(谢谢!),如果您不使用任何配置文件,您还可以添加以下标志:

jest --testEnvironment node    
# or 
jest --env=node

【讨论】:

这对我有用!这就是你需要的答案!谢谢! 作者好像没有node环境,应该设置testEnvironment: "jsdom"。这适用于我的最新更新。谢谢你的建议! 正如下面其他一些答案中提到的,您可以通过运行jest --testEnvironment node 或其简写形式jest --env=node 跳过配置文件(或package.json 属性)的生成。 这应该是公认的答案。它似乎更适合错误。此外,如果您只是测试脚本,那么定义 testURL 是没有意义的。【参考方案3】:

您必须指定要使用的环境 (--env)。

当您在package.json 中运行jest 命令时,您应该指定环境(jsdomnode)。例如:

  "scripts": 
    "jest": "jest --env=node --colors --coverage test",
    "test": "npm run jest"
  ,

这应该适合你!

【讨论】:

如果您使用的是 jsdom,无论您是否通过配置或命令行指定 env,都会发生同样的事情。这只是从今天 jest 的最新更新开始发生的。如果您遇到这种情况,请参阅@David R 的答案以获得解决方案。 有道理,环境决定了测试应该如何运行,而jsdom似乎是默认的。【参考方案4】:

如果您使用的是 jsdom,请确保包含 url。

签出 jsdom 存储库的简单选项。 https://github.com/jsdom/jsdom#simple-options

const jsdom = require("jsdom");
const  JSDOM  = jsdom;

const dom = new JSDOM(`...`,  url: "https://example.org/" );

【讨论】:

就我而言,我在我的 jsdom 配置文件中添加了该代码。 var jsdom = require('jsdom'); var exposedProperties = ['window', 'navigator', 'document']; const JSDOM = jsdom; const document = (new JSDOM('', url: "https://localhost/",)).window; global.document = document; +1 虽然不是专门针对 Jest,但这是一种替代解决方案,可用于其他设置(因为这是错误代码的顶部 SO,其他人,比如我,会找到这个页面谁不使用 Jest)根据@dspacejs 好问题,这将是一个单独的文件,通过package.json 中的测试命令调用。例如,此代码可以保存在 testHelper.ts 文件中并使用 mocha 调用:scripts: test-setup: 'mocha --compilers ts:ts-node/register,tsx:ts-nocde/register --require testHelper.ts --reporter progress' 【参考方案5】:

在我的 Jest 配置中添加 testURL: "http://localhost" 的***答案中的建议对我不起作用。但是,this suggestion from the jsdom GitHub discussion 在创建 jsdom 对象时传入了 URL。

const url = 'http://localhost';

const dom = new JSDOM('<!DOCTYPE html><html><body></body></html>',  url );

【讨论】:

【参考方案6】:

要解决 Jest SecurityError: localStorage 错误,您需要将 jest: ... 部分添加到您的 package.json 文件中



"name": "...",
"version": "..",
"main": "..",
"description": "...",
...

"jest":  "verbose": true, "testURL": "http://localhost/" ,


【讨论】:

【参考方案7】:

对我来说,这是通过升级到 "jest": "^24.9.0",

【讨论】:

【参考方案8】:

这听起来可能很傻,但对我来说,问题是因为我错误地安装了带有npm update 的随机包。我运行npm install,然后运行npm update,但我应该只运行npm install。我通过删除node_modules 目录并再次运行npm install 解决了这个问题。

【讨论】:

这与我有关,实际上由于企业代理,我无法正确完成npm install。因此,该模式将未完成npm installation【参考方案9】:

在使用 React JS 时,您不需要做任何事情。放置 JEST 并设置测试环境是 create-react-app 的默认行为。 在下面运行时,它开始显示测试成功或失败,

npm 测试

如果您想要测试覆盖率,您只需将以下内容添加到 package.json 文件中

"test": "react-scripts 测试 --coverage" 现在你的 package.json 的“脚本”看起来像,

"scripts": 
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test --coverage",
"eject": "react-scripts eject"

【讨论】:

【参考方案10】:

当我将enzymejest 集成时,我弹出了这个。 Github Issue Discussion 建议与上述相同,即添加

"testURL": "http://localhost/"

到开玩笑的配置。然而,很高兴知道这也是由酶触发的。对我来说,它是 React v15 和 v15 适配器。

【讨论】:

【参考方案11】:

我有同样的问题,把它放在我的 package.json 文件中对我有用:

"jest": 
    "verbose": true,
    "testURL": "http://localhost/"
 

【讨论】:

【参考方案12】:

如果您使用的是 jsdom,则必须更改设置以进行如下测试:

const  JSDOM  = require('jsdom');
const jsdom = new JSDOM('<!doctype html><html><body></body></html>', 
  url: 'http://localhost/',
);```

【讨论】:

以上是关于Jest SecurityError:localStorage 不适用于不透明的来源的主要内容,如果未能解决你的问题,请参考以下文章

Flash,SecurityError:错误 #2028:Local-with-filesystem SWF 无法访问 Internet URL

flash SecurityError: 错误 #2028: Local-with-filesystem SWF 文件

Jest 找不到 MONGO_URI 的 .env.local

SecurityError:错误 #2148:SWF 文件文件

IE10 上的 WebSocket 给出 SecurityError

SecurityError (DOM Exception 18): 操作不安全 WKWebkit iOS 10