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

ami*_*han 140 javascript node.js npm jestjs

当我想用命令运行我的项目时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>)
Run Code Online (Sandbox Code Playgroud)

Dav*_*d R 134

如果您使用http://localhost前缀访问您的应用程序,则需要更新您的jest配置(在您的jest.config.js)中,

  "jest": {
    "verbose": true,
    "testURL": "http://localhost/"
  }
Run Code Online (Sandbox Code Playgroud)

如果您还没有任何jest配置,只需在您的配置中包含配置package.json.例如:

{
  "name": "...",
  "description": "...",
  ...
  "jest": {
    "verbose": true,
    "testURL": "http://localhost/"
  }
}
Run Code Online (Sandbox Code Playgroud)

或者在jest.config.js:

module.exports = {
  verbose: true,
  testURL: "http://localhost/",
  ...
}
Run Code Online (Sandbox Code Playgroud)

或者如果您已projects配置:

module.exports = {
  verbose: true,

  projects: [{
    runner: 'jest-runner',
    testURL: "http://localhost/",

    // ...
  }]
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,这对我有用...虽然我不太明白为什么我需要这个,也不知道为什么它在最新升级之前工作 (16认同)
  • 您还可以在npm脚本中使用cli选项:`jest --testURL = \“ http:// localhost \”`。如果由于其他环境而无法设置全局Jest配置,则很有用(对我来说是反应脚本)。 (2认同)

Bur*_*rgi 75

我只是在一个大的monorepo中出现了这种情况(在单元测试中,否则就不需要jsdom).在我们jest.config.js(或package.json等效的)中明确设置以下内容也缓解了这个问题:

module.exports = {
  testEnvironment: 'node'
}
Run Code Online (Sandbox Code Playgroud)

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

jest --testEnvironment node    
# or 
jest --env=node
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用!这就是你需要的答案!谢谢! (3认同)
  • 正如下面的一些其他答案中所提到的,您可以通过运行`jest --testEnvironment node`或其简写`jest --env = node`,intead来跳过配置文件(或package.json属性)的生成. (3认同)
  • 这应该是公认的答案.这似乎更适合错误.此外,如果您只是测试脚本,则定义`testURL`是没有意义的. (2认同)

小智 16

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

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

  "scripts": {
    "jest": "jest --env=node --colors --coverage test",
    "test": "npm run jest"
  },
Run Code Online (Sandbox Code Playgroud)

这对你有用!


G. *_*lon 10

我遇到了同样的问题,手动安装jest-environment-jsdom版本 28(基于此 GitHub 线程)解决了它。


小智 8

当我将 jest 更新到 v28.0.3 时,我遇到了这个问题。似乎在版本 28.0.0 中,他们废弃了 testUrl 并引入了一个对象 testEnvironmentOptions,其属性 url 的默认值是“http://localhost/”。

弃用警告:

选项“testURL”已替换为通过“testEnvironmentOptions.url”传递 URL。

请更新您的配置。

配置文档: https://jestjs.io/docs/configuration

在这里查看 PR: https: //github.com/facebook/jest/pull/10797

然而,当我更新 jest-environment-jsdom 并在 jest.config.js 中设置 testEnvironment 时,我的问题消失了。

module.exports = {
  ...
  testEnvironment: 'jest-environment-jsdom',
  ...
}
Run Code Online (Sandbox Code Playgroud)


p8u*_*8ul 5

如果您使用的是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/" });
Run Code Online (Sandbox Code Playgroud)


Sco*_*tin 5

添加testURL: "http://localhost"到我的 Jest 配置的最受好评的答案中的建议对我不起作用。然而,来自 jsdom GitHub 讨论的这个建议,即在创建 jsdom 对象时传入一个 URL,确实如此。

const url = 'http://localhost';

const dom = new JSDOM('<!DOCTYPE html><html><body></body></html>', { url });
Run Code Online (Sandbox Code Playgroud)