Jest SecurityError: localStorage tidak tersedia untuk asal yang buram

144

Ketika saya ingin menjalankan proyek saya dengan perintah npm run test, saya mendapatkan kesalahan di bawah ini. Apa yang menyebabkan ini?

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
sumber
Bagaimana Anda mengakses aplikasi Anda? .. Maksud saya, Apakah Anda mengaksesnya seperti http://localhost:port...,?
David R
Ini masalah dengan test runner, @DavidR, Dia memiliki masalah dengan >>> npm run test <<<
Martin Chaov
@ MartinChaov Yup, saya tahu itu. Saya ingin melihat jawabannya untuk memeriksa apakah ada sesuatu yang salah dalam jestkonfigurasi :-)
David R
1
Saya baru saja mulai menjalankan ini sendiri ... Saya tidak menggunakan penyimpanan lokal sama sekali dalam kode. Apakah kode Anda menggunakan ts-jest juga?
k2snowman69
@ k2snowman69 Silakan periksa jawaban saya dan kirim komentar Anda.
David R

Jawaban:

139

Dalam hal, jika Anda mengakses aplikasi Anda dengan http://localhostawalan, Anda perlu memperbarui konfigurasi lelucon Anda (di Anda jest.config.js) sebagai,

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

Jika Anda belum memiliki konfigurasi lelucon, cukup sertakan konfigurasi di package.json. Sebagai contoh:

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

atau di jest.config.js:

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

atau jika Anda telah projectsmengkonfigurasi:

module.exports = {
  verbose: true,

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

    // ...
  }]
}
David R
sumber
17
Yap ini bekerja untuk saya ... meskipun saya tidak begitu mengerti mengapa saya membutuhkan ini atau mengapa itu bekerja sebelum pembaruan terbaru
k2snowman69
1
Ini dibahas di jesthalaman github: github.com/facebook/jest/issues/6766
Jordan Bonitatis
2
Anda juga dapat menggunakan opsi cli dalam naskah NPM Anda: jest --testURL=\"http://localhost\". Berguna jika Anda tidak dapat mengatur konfigurasi jest global karena lingkungan lain (bereaksi skrip untuk saya).
Burrich
Saya sedang mengerjakan reaksi asli. Bahkan bagi saya testUrlbekerja.
Jimit Patel
78

Saya baru saja memotong ini di monorepo besar (dalam unit test, yang sebaliknya tidak akan diperlukan jsdom). Menyetel secara eksplisit hal-hal berikut dalam kami jest.config.js(atau yang package.jsonsetara) juga meringankan masalah itu:

module.exports = {
  testEnvironment: 'node'
}

Pembaruan: Seperti yang disebutkan Nicolas di bawah (terima kasih!), Anda juga dapat menambahkan flag berikut jika Anda tidak menggunakan file konfigurasi:

jest --testEnvironment node    
# or 
jest --env=node
Burgi
sumber
3
Ini berhasil untuk saya! INI adalah jawaban yang Anda butuhkan! Terima kasih!
blueprintchris
Tampaknya penulis tidak memiliki simpul lingkungan - dalam kasusnya ia harus mengatur testEnvironment: "jsdom". Ini berfungsi untuk saya dengan pembaruan terbaru. Terima kasih atas saranmu!
Philipp Möhler
3
Seperti disebutkan dalam beberapa jawaban lain di bawah ini, Anda dapat melewati pembuatan file config (atau properti package.json) dengan menjalankan jest --testEnvironment nodeatau singkatannya jest --env=node, intead.
Nicolás Fantone
2
Ini harus menjadi jawaban yang diterima. Tampaknya lebih tepat untuk kesalahan tersebut. Juga jika Anda hanya menguji skrip, tidak masuk akal untuk mendefinisikan a testURL.
Dez
16

Anda harus menentukan lingkungan apa ( --env) yang akan Anda gunakan.

Ketika Anda menjalankan jestperintah di, package.jsonAnda harus menentukan lingkungan ( jsdomatau node). Sebagai contoh:

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

Ini seharusnya bekerja untuk Anda!

Manuel Morejón
sumber
1
Jika Anda menggunakan jsdom, hal yang sama terjadi terlepas dari apakah Anda menentukan envvia config atau commandline atau tidak. Ini hanya mulai terjadi dengan pembaruan terbaru jest hari ini. Silakan lihat jawaban @ David R untuk solusi jika ini yang Anda alami.
fisch2
7

Jika Anda menggunakan jsdom, pastikan Anda memasukkan url.

Lihat opsi sederhana repositori jsdom. https://github.com/jsdom/jsdom#simple-options

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

const dom = new JSDOM(`...`, { url: "https://example.org/" });
p8ul
sumber
Dalam kasus saya, saya menambahkan kode itu dalam file konfigurasi jsdom saya. 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 Meskipun tidak secara khusus tentang Jest, ini adalah solusi alternatif dan dapat digunakan untuk pengaturan lain (karena ini adalah SO teratas untuk kode kesalahan, yang lain, seperti saya, akan menemukan halaman ini yang tidak menggunakan Jest) Per @ dspacejs pertanyaan yang bagus, ini akan menjadi file terpisah yang dipanggil melalui perintah uji Anda package.json. Sebagai contoh, kode ini bisa disimpan dalam testHelper.tsfile yang disebut dan menggunakan mocha: scripts: { test-setup: 'mocha --compilers ts:ts-node/register,tsx:ts-nocde/register --require testHelper.ts --reporter progress' }.
jmbertucci
4

Saran dalam jawaban teratas testURL: "http://localhost"untuk menambahkan ke konfigurasi Jest saya tidak bekerja untuk saya. Namun, saran dari diskusi jsdom GitHub ini , untuk meneruskan URL ketika membuat objek jsdom, berhasil.

const url = 'http://localhost';

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

bagi saya ini diselesaikan dengan memutakhirkan ke "lelucon": "^ 24.9.0",

Mike Rodov
sumber
0

Ini mungkin terdengar konyol, tetapi bagi saya, masalah itu disebabkan karena saya keliru menginstal paket acak npm update. Saya berlari npm installdan kemudian npm updatetetapi saya seharusnya hanya berlari npm install. Saya memperbaiki masalah dengan menghapus node_modulesdirektori dan menjalankan npm installlagi.

Rock Lee
sumber
Ini berkaitan dengan saya, saya sebenarnya tidak dapat menyelesaikan npm installdengan benar karena proxy perusahaan. Jadi, pola akan belum selesai npm installasi
Z. Khullah
0

Anda tidak perlu melakukan apa pun saat bekerja dengan Bereaksi JS. Ini adalah perilaku default aplikasi create-react-app untuk menempatkan JEST dan mengatur lingkungan pengujian. Saat menjalankan di bawah ini, itu mulai menunjukkan keberhasilan tes atau gagal,

tes npm

Jika Anda ingin cakupan pengujian, Anda hanya perlu menambahkan di bawah ini ke file package.json

"test": "react-scripts test --coverage" Sekarang "script" Anda dari package.json terlihat seperti,

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

}

Amjad Khan
sumber
0

Ini muncul dengan saya ketika berintegrasi enzymedengan jest. The Github Isu Diskusi menyarankan sama seperti disebutkan di atas, yaitu menambahkan

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

ke konfigurasi lelucon. Namun, ada baiknya mengetahui bahwa ini dipicu juga oleh enzim. Bagi saya itu React v15 dan adaptor v15.

pascalwhoop
sumber
0

Saya memiliki masalah yang sama dan menempatkan ini di package.jsonfile saya berfungsi untuk saya:

"jest": {
    "verbose": true,
    "testURL": "http://localhost/"
} 
Zahid Ali
sumber
0

Untuk mengatasi Jest SecurityError: localStoragekesalahan, Anda perlu menambahkan jest: { ... }bagian ke file package.json Anda

{

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

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

}
Eugène Beliaev
sumber