javascript - Jest SecurityError: localStorage är inte tillgängligt för ogenomskinliga ursprung


När jag vill köra mitt projekt med kommandot npm run test, får jag felet nedan. Vad orsakar detta?

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

Svar #1

Om du skulle komma åt din applikation med prefixet http://localhost, behöver du uppdatera din jest-konfiguration (i din jest.config.js) enligt,

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

Om du inte redan har någon jest-konfiguration, inkludera bara konfigurationen i din package.json. Till exempel:

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

eller i jest.config.js :

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

eller om du har projects konfigurerade:

module.exports = {
  verbose: true,
  
  projects: [{
    runner: 'jest-runner',
    testURL: "http://localhost/",

    // ...
  }]
}

för konfiguration i package.json, tas testURL bort i jest v28. Nu bör du använda testEnvironmentOptions för att skicka url-alternativ så här:

"jest": {
    "verbose": true,
    "testEnvironmentOptions": {
        "url": "http://localhost/"
    }
}

Svar #2

Jag stötte precis på detta i ett stort monorepo (i enhetstester, som annars inte skulle ha krävt jsdom). Att uttryckligen ställa in följande i vår jest.config.js (eller motsvarigheten i package.json) lindrade också det problemet:

module.exports = {
  testEnvironment: 'node'
}

Uppdatering: Som Nicolas nämnde nedan (tack!), kan du också lägga till följande flaggor om du inte använder några konfigurationsfiler:

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

Svar #3

Du måste specificera vilken miljö (--env) du ska använda.

När du kör jest-kommandot i package.json bör du specificera miljön (jsdom eller node). Till exempel:

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

Detta borde fungera för dig!

Svar #4

Jag hade samma problem och att manuellt installera jest-environment-jsdom version 28 (baserat på denna GitHub-tråd) löste det.

Svar #5

Om du använder jsdom, se till att du inkluderar url.

Kolla in jsdom-förrådets enkla alternativ. https://github.com/jsdom/jsdom#simple-options

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

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

Relaterade artiklar