Jest SecurityError: localStorage недоступний для непрозорого джерела


144

Коли я хочу запустити мій проект із командою 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>)

Як ви отримуєте доступ до вашої програми? Я маю на увазі, чи ви отримуєте доступ до неї як http://localhost:port...?
Девід R

Це проблема з тестовим бігуном, @DavidR, у нього проблема з >>> тестом запуску npm <<<
Мартин Чаов

@MartinChaov Yup Я це знаю. Я хотів би побачити його відповідь, щоб перевірити, чи щось не так у його jestконфігурації :-)
David R

1
Я щойно почав сам стикатися з цим ... Я взагалі не використовую локальний накопичувач у коді. Чи використовується ваш код також і ts-vice?
k2snowman69

@ k2snowman69 Будь ласка, перевірте мою відповідь та опублікуйте свій коментар.
Девід R

Відповіді:


139

Якщо ви звертаєтесь до своєї програми з http://localhostпрефіксом, вам потрібно оновити конфігурацію жарту (у своєму jest.config.js) як,

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

Якщо ви ще не маєте жодної конфігурації, просто включіть її у свою конфігурацію package.json. Наприклад:

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

або в jest.config.js:

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

або якщо ви projectsналаштували:

module.exports = {
  verbose: true,

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

    // ...
  }]
}

17
Так, це спрацювало для мене ... хоча я не зовсім розумію, для чого мені це потрібно, і навіщо він працював до останнього оновлення
k2snowman69

1
Про це йдеться на jestсторінці github: github.com/facebook/jest/isissue/6766
Jordan Bonitatis

2
Ви також можете використовувати командний рядок опцію у вашому НПМ сценарії: jest --testURL=\"http://localhost\". Корисно, якщо ви не можете встановити глобальну конфігурацію жарту через інше середовище (реакційні сценарії для мене).
Бурріх

Я працюю над реакцією рідного. Навіть для мене testUrlпрацювали.
Джиміт Патель

78

У мене щойно з'явилося це велике монорепо (в одиничних тестах, що в іншому випадку не вимагало б jsdom). Явне встановлення наступного в нашому jest.config.js(або package.jsonеквіваленті) також усунуло це питання:

module.exports = {
  testEnvironment: 'node'
}

Оновлення: Як Ніколас згадав нижче (спасибі!), Ви також можете додати такі прапори, якщо ви не використовуєте жодних конфігураційних файлів:

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

3
Це працювало для мене! ЦЕ відповідь, яка вам потрібна! Дякую!
blueprintchris

Здається, що автор не має середовища вузла - у його випадку він повинен встановити testEnvironment: "jsdom". Це працює для мене з останнім оновленням. Дякую за вашу пораду!
Філіп Мёлер

3
Як зазначено в деяких інших відповідях нижче, ви можете пропустити генерацію конфігураційного файлу (або властивості package.json), запустивши jest --testEnvironment nodeабо стенограму jest --env=node, interad.
Nicolás Fantone

2
Це має бути прийнятою відповіддю. Здається більш доцільним помилка. Крім того, якщо ви протестуєте лише сценарії, не має сенсу визначати testURL.
Дез

16

Ви повинні вказати, яке середовище ( --env) ви збираєтесь використовувати.

Коли ви запускаєте jestкоманду, package.jsonвам слід вказати середовище ( jsdomабо node). Наприклад:

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

Це має працювати для вас!


1
Якщо ви використовуєте jsdom, те ж саме відбувається незалежно від того, ви вказали envчерез конфігурацію чи командний рядок чи ні. Це почалося лише з останнього оновлення джея сьогодні. Будь ласка, дивіться відповідь @David R для рішення, якщо це так для вас.
fisch2

7

Якщо ви використовуєте 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/" });

У моєму випадку я додав цей код у свій файл конфігурації 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 Хоча конкретно не про Jest, це альтернативне рішення, і його можна використовувати для інших налаштувань (оскільки це верхній SO для коду помилки, інші, як я, знайдуть цю сторінку, яка не використовує Jest) Per @ Добре запитання dspacejs, це буде окремий файл, який викликається за допомогою вашої тестової команди в package.json. Наприклад, цей код може бути збережений в testHelper.tsфайлі і викликається з допомогою мокко: scripts: { test-setup: 'mocha --compilers ts:ts-node/register,tsx:ts-nocde/register --require testHelper.ts --reporter progress' }.
jmbertucci

4

Пропозиція у найвищому рейтингу відповіді щодо додавання testURL: "http://localhost"до моєї конфігурації Jest не працювала для мене. Однак ця пропозиція з дискусії jsdom GitHub про введення URL-адреси при створенні об’єкта jsdom зробила.

const url = 'http://localhost';

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


0

Це може здатися дурним, але для мене проблема була викликана тим, що я помилково встановив випадкові пакети npm update. Я бігав npm installі тоді, npm updateале я мав би тільки бігати npm install. Я усунув проблему, видаливши node_modulesкаталог та запустивши npm installзнову.


Це стосується мене, я фактично не зміг закінчити npm installналежним чином через проксі-сервера. Таким чином, картина буде незавершеною npm installAtion
Z. Khullah

0

Не потрібно нічого робити під час роботи з React JS. Це поведінка програми "create-react-app" за замовчуванням для розміщення JEST та налаштування тестового середовища. Після запуску нижче він починає показувати успіх тесту або провал,

npm тест

Якщо ви хочете перевірити покриття, вам просто потрібно додати нижче файл file.json

"test": "реакція-скрипти тест - покриття" Тепер ваш "скрипт" пакета package.json виглядає так,

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

}


0

Це з'явилося зі мною при інтеграції enzymeз jest. Github Проблема Обговорення передбачає таке ж , як було зазначено вище, а саме при додаванні

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

до конфігурації vice. Однак добре знати, що це викликано також ферментом. Для мене це був React v15 та адаптер v15.


0

У мене є та сама проблема, і розміщення цього в моєму package.jsonфайлі працювало на мене:

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

0

Щоб вирішити Jest SecurityError: localStorageпомилку, потрібно додати jest: { ... }частину до файлу package.json

{

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

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

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.