Lorsque je veux exécuter mon projet avec la commande npm run test
, le message d'erreur ci-dessous s'affiche. Qu'est-ce qui cause ça?
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>)
Si vous accédez à votre application avec un préfixe http://localhost
, vous devez mettre à jour votre configuration de plaisanterie (dans votre jest.config.js
) en tant que,
"jest": {
"verbose": true,
"testURL": "http://localhost/"
}
Si vous n'avez pas encore de configuration plaisante, incluez-la simplement dans votre package.json
. Par exemple:
{
"name": "...",
"description": "...",
...
"jest": {
"verbose": true,
"testURL": "http://localhost/"
}
}
ou en jest.config.js
:
module.exports = {
verbose: true,
testURL: "http://localhost/",
...
}
ou si vous avez projects
configuré:
module.exports = {
verbose: true,
projects: [{
runner: 'jest-runner',
testURL: "http://localhost/",
// ...
}]
}
Je viens d'avoir cela surgir dans un grand monorepo (dans les tests unitaires, qui n'auraient autrement pas besoin de jsdom). La définition explicite de ce qui suit dans notre jest.config.js
(ou l'équivalent package.json
) a également résolu ce problème:
module.exports = {
testEnvironment: 'node'
}
Mise à jour: Comme Nicolas mentionné ci-dessous (merci!), Vous pouvez également ajouter les indicateurs suivants si vous n'utilisez aucun fichier de configuration:
jest --testEnvironment node
# or
jest --env=node
Vous devez spécifier quel environnement (--env
) allez-vous utiliser.
Lorsque vous exécutez la commande jest
dans le package.json
, vous devez spécifier l'environnement (jsdom
ou node
). Par exemple:
"scripts": {
"jest": "jest --env=node --colors --coverage test",
"test": "npm run jest"
},
Cela devrait fonctionner pour vous!
Si vous utilisez jsdom, assurez-vous d'inclure l'URL.
Commander les options simples du référentiel jsdom. https://github.com/jsdom/jsdom#simple-options
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const dom = new JSDOM(`...`, { url: "https://example.org/" });
Cela peut paraître idiot, mais pour moi, le problème a été causé par l’installation par erreur de paquets aléatoires avec npm update
. J'exécutais npm install
et ensuite npm update
mais je n'aurais dû exécuter que npm install
. J'ai résolu le problème en supprimant le répertoire node_modules
et en exécutant à nouveau npm install
.
Cela m'est apparu lors de l'intégration de enzyme
avec jest
. La Discussion sur le problème Github suggère la même chose que celle indiquée ci-dessus, à savoir l’ajout de
"testURL": "http://localhost/"
à la config de plaisanterie Cependant, il est bon de savoir que cela est également déclenché par une enzyme. Pour moi, c'était React v15 et l'adaptateur v15.
La suggestion dans la réponse la mieux notée d'ajouter testURL: "http://localhost"
à ma configuration Jest n'a pas fonctionné pour moi. Cependant, cette suggestion de la discussion jsdom GitHub , de transmettre une URL lors de la création de l’objet jsdom, s’est faite.
const url = 'http://localhost';
const dom = new JSDOM('<!DOCTYPE html><html><body></body></html>', { url });
Vous n'avez rien à faire lorsque vous travaillez avec React JS. C’est le comportement par défaut de l’application create-react-app de placer JEST et de configurer l’environnement de test.
test npm
Si vous souhaitez tester la couverture, il vous suffit d’ajouter ci-dessous un fichier package.json.
"test": "react-scripts test --coverage" Maintenant, votre "script" de package.json ressemble,
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test --coverage",
"eject": "react-scripts eject"
}