Jest SecurityError: localStorage não está disponível para origens opacas


144

Quando quero executar meu projeto com o comando npm run test, recebo o erro abaixo. O quê está causando isto?

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

Como você acessa seu aplicativo? ... Quero dizer, você está acessando como http://localhost:port...,?
— David R

Este é um problema com o executor de teste, @DavidR, ele tem problemas com >>> npm run test <<< #
— Martin Chaov

@MartinChaov Sim, eu sei disso. Eu gostaria ver sua resposta, a fim de verificar se algo de errado em sua jestconfiguração :-)
— David R

1
Eu mesmo comecei a me deparar com isso ... Não estou usando armazenamento local no código. Seu código também está usando o ts-jest?
— K2snowman69

@ k2snowman69 Por favor, verifique minha resposta e poste seu comentário.
— David R

Respostas:


139

No caso, se você estiver acessando seu aplicativo com um http://localhostprefixo, precisará atualizar sua configuração de gracejo (no seu jest.config.js) como,

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

Caso você ainda não tenha nenhuma configuração de brincadeira, inclua a configuração no seu package.json. Por exemplo:

{
  "name": "...",
  "description": "...",
  ...
  "jest": {
    "verbose": true,
    "testURL": "http://localhost/"
  }
}

ou em jest.config.js:

module.exports = {
  verbose: true,
  testURL: "http://localhost/",
  ...
}

ou se você projectsconfigurou:

module.exports = {
  verbose: true,

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

    // ...
  }]
}

17
Yep isso funcionou para mim ... embora eu não entendo muito bem porque eu preciso disso nem por que ele estava funcionando antes da última atualização
— k2snowman69

1
Isso é discutido na jestpágina do github: github.com/facebook/jest/issues/6766
— Jordan Bonitatis

2
Você também pode usar a opção cli em seu script npm: jest --testURL=\"http://localhost\". Útil se você não pode definir uma configuração global de gracejo por causa de outro ambiente (scripts de reação para mim).
— Burrich

Estou trabalhando em reagir nativo. Até para mim testUrlfuncionou.
— precisa saber é o seguinte

78

Eu acabei de aparecer em um grande monorepo (em testes de unidade, que de outra forma não exigiria jsdom). Definir explicitamente o seguinte em nosso jest.config.js(ou package.jsonequivalente) também aliviou esse problema:

module.exports = {
  testEnvironment: 'node'
}

Atualização: Como Nicolas mencionou abaixo (obrigado!), Você também pode adicionar os seguintes sinalizadores se não estiver usando nenhum arquivo de configuração:

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

3
Isso funcionou para mim! Esta é a resposta que você precisa! Obrigado!
— precisa

Parece que o autor não possui um ambiente de nós - no seu caso, ele deve definir testEnvironment: "jsdom". Isso funciona para mim com a atualização mais recente. Obrigada pelo Conselho!
— Philipp Möhler

3
Como mencionado em algumas outras respostas abaixo, você pode pular a geração de um arquivo de configuração (ou propriedade package.json) executando jest --testEnvironment nodeou em sua abreviação jest --env=node, intead.
— Nicolás Fantone

2
Essa deve ser a resposta aceita. Parece mais apropriado para o erro. Além disso, se você estiver apenas testando scripts, não faz sentido definir a testURL.
— Dez

16

Você deve especificar qual ambiente (--env ) você vai usar.

Ao executar o jestcomando no, package.jsonvocê deve especificar o ambiente ( jsdomou node). Por exemplo:

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

Isso deve funcionar para você!


1
Se você estiver usando jsdom, a mesma coisa acontece, independentemente de você especificar ou não uma envvia config ou linha de comando. Isso só começou a acontecer com a atualização mais recente de brincadeira hoje. Consulte a resposta de @David R para obter uma solução, se esse for o seu caso.
— fisch2

7

Se você estiver usando jsdom, certifique-se de incluir o URL.

Repositório jsdom repositório de opções simples. https://github.com/jsdom/jsdom#simple-options

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

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

No meu caso, adicionei esse código no meu arquivo de configuração jsdom. var jsdom = require('jsdom'); var exposedProperties = ['window', 'navigator', 'document']; const { JSDOM } = jsdom; const {document } = (new JSDOM('',{ url: "https://localhost/",})).window; global.document = document;
— P8ul

+1 Embora não seja especificamente sobre o Jest, esta é uma solução alternativa e pode ser usada para outras configurações (como esse é o SO principal para o código de erro, outros, como eu, encontrarão esta página que não está usando o Jest) Per @ boa pergunta do dspacejs, esse seria um arquivo separado chamado por meio do seu comando de teste package.json. Por exemplo, este código pode ser salvo em um testHelper.tsarquivo e chamado usando mocha: scripts: { test-setup: 'mocha --compilers ts:ts-node/register,tsx:ts-nocde/register --require testHelper.ts --reporter progress' }.
— precisa saber é o seguinte

4

A sugestão na resposta mais votada de adicionar testURL: "http://localhost"à minha configuração do Jest não funcionou para mim. No entanto, essa sugestão da discussão do jsdom GitHub , de passar uma URL ao criar o objeto jsdom, foi o que aconteceu.

const url = 'http://localhost';

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

1

para mim, isso foi resolvido com a atualização para "gracejo": "^ 24.9.0",


0

Isso pode parecer bobagem, mas para mim, o problema foi causado porque eu instalei pacotes aleatórios por engano npm update. Eu estava correndo npm installe então, npm updatemas eu deveria ter apenas corrido npm install. Corrigi o problema excluindo o node_modulesdiretório e executando npm installnovamente.


Isso está relacionado a mim, na verdade não consegui concluir npm installcorretamente devido ao proxy corporativo. Assim, o padrão seria incompleto npm installção
— Z. Khullah

0

Você não precisa fazer nada enquanto trabalha com o React JS. O comportamento padrão do create-react-app é colocar o JEST e configurar o ambiente de teste. Na execução abaixo, ele começa a mostrar o êxito ou falha do teste,

teste npm

Caso você queira uma cobertura de teste, basta adicionar abaixo ao arquivo package.json

"test": "react-scripts test --coverage" Agora o seu "script" do package.json parece,

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

}


0

Isso apareceu comigo ao integrar enzymecom jest. A discussão sobre questões do Github sugere o mesmo que mencionado acima, ou seja, adicionar

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

para a configuração de brincadeira. No entanto, é bom saber que isso também é desencadeado por enzimas. Para mim, foi o React v15 e o adaptador v15.


0

Eu tenho o mesmo problema e colocar isso no meu package.jsonarquivo funcionou para mim:

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

0

Para resolver o Jest SecurityError: localStorageerro, você precisa adicionar a jest: { ... }peça ao seu arquivo package.json

{

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

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

}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.