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>)
amirdehghan
fonte
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/",

    // ...
  }]
}
David R
fonte
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
Burgi
fonte
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ê!

Manuel Morejón
fonte
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/" });
p8ul
fonte
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 });
Scott Martin
fonte
1

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

Mike Rodov
fonte
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.

Rock Lee
fonte
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"

}

Amjad Khan
fonte
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.

pascalwhoop
fonte
0

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

"jest": {
    "verbose": true,
    "testURL": "http://localhost/"
} 
Zahid Ali
fonte
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/" },

}
Eugène Beliaev
fonte