Jest SecurityError: localStorage opak kökenler için kullanılamaz


144

Projemi komutla çalıştırmak istediğimde npm run testaşağıdaki hatayı alıyorum. Buna ne sebep oluyor?

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

Başvurunuza nasıl erişiyorsunuz? .. Yani, şuna mı erişiyorsunuz http://localhost:port...?
David R

Bu test koşucusu, @DavidR ile ilgili bir sorun, >>> npm çalışma testi ile sorunu var <<<
Martin Chaov

@MartinChaov Yup Bunu biliyorum. Ben onun jestyapılandırma yanlış bir şey olup olmadığını kontrol etmek için cevabını görmek istiyorum :-)
David R

1
Ben kendim bu çalışmaya başladım ... Kod hiç yerel depolama kullanmıyorum. Kodunuz ts-jest kullanıyor mu?
k2snowman69

@ k2snowman69 Lütfen cevabımı kontrol edin ve yorumunuzu gönderin.
David R

Yanıtlar:


139

Uygulamanıza bir http://localhostönekle erişiyorsanız , jest yapılandırmanızı (sizin için jest.config.js) olarak güncellemeniz gerekir.

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

Zaten herhangi bir jest yapılandırmanız yoksa, yapılandırmayı bilgisayarınıza ekleyin package.json. Örneğin:

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

veya jest.config.js:

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

veya projectsyapılandırdıysanız:

module.exports = {
  verbose: true,

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

    // ...
  }]
}

17
Evet, bu benim için çalıştı ... ama neden buna ihtiyacım olduğunu ya da en son yükseltmeden önce neden çalıştığını tam olarak anlamıyorum
k2snowman69

1
Bu, jestgithub sayfasında tartışılmaktadır : github.com/facebook/jest/issues/6766
Jordan Bonitatis

2
Ayrıca npm komut cli seçeneğini kullanabilirsiniz: jest --testURL=\"http://localhost\". Başka bir ortam nedeniyle global bir jest yapılandırması ayarlayamazsanız kullanışlıdır (benim için tepki komut dosyaları).
Burrich

Ben yerli tepki üzerinde çalışıyorum. Benim için bile testUrlçalıştı.
Jimit Patel

78

Ben sadece bu büyük bir monorepo (birim testlerde, aksi takdirde jsdom gerekli olmazdı) kırpma vardı. Bizim jest.config.js(veya package.jsoneşdeğeri) içinde aşağıdakileri açıkça ayarlamak da bu sorunu hafifletti:

module.exports = {
  testEnvironment: 'node'
}

Güncelleme: Nicolas'ın aşağıda belirttiği gibi (teşekkürler!), Herhangi bir yapılandırma dosyası kullanmıyorsanız aşağıdaki bayrakları da ekleyebilirsiniz:

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

3
Bu benim için çalıştı! BU ihtiyacınız olan cevap! Teşekkürler!
blueprintchris

Yazarın düğüm ortamı olmadığı anlaşılıyor - durumunda testEnvironment: "jsdom" ayarlamalıdır. En son güncelleme ile bu benim için çalışıyor. Tavsiyen için teşekkürler!
Philipp Möhler

3
Aşağıdaki diğer yanıtlarda belirtildiği gibi, bir yapılandırma dosyasının (veya package.json özelliğinin) oluşturulmasını çalıştırarak jest --testEnvironment nodeveya kısayol jest --env=node, intead'i atlayabilirsiniz.
Nicolás Fantone

2
Bu kabul edilen cevap olmalı. Hata için daha uygun görünüyor. Ayrıca yalnızca komut dosyalarını test ediyorsanız, a tanımlamak mantıklı değildir testURL.
Dez

16

Hangi ortamı (--env ) kullanacağınızı .

jestKomutu çalıştırdığınızda package.jsonortamı ( jsdomveya node) belirtmelisiniz . Örneğin:

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

Bu sizin için işe yarar!


1
Jsdom kullanıyorsanız, bir envyapılandırma veya komut satırı belirtip belirtmemenizden bağımsız olarak aynı şey olur . Bu sadece jestin son güncellemesiyle bugün başladı. Sizin için durum buysa, lütfen @David R'nin bir çözüm için cevabına bakın.
fisch2

7

Jsdom kullanıyorsanız, URL'yi eklediğinizden emin olun.

Ödeme jsdom depo basit seçenekler. https://github.com/jsdom/jsdom#simple-options

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

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

Benim durumumda jsdom yapılandırma dosyasına bu kodu ekledim. 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 Özellikle Jest ile ilgili olmasa da, bu alternatif bir çözümdür ve diğer kurulumlar için kullanılabilir (bu hata kodu için en üstteki SO olduğundan, benim gibi diğerleri Jest kullanmayan bu sayfayı bulacaktır) Per @ dspacejs iyi soru, bu test komutuyla çağrılan ayrı bir dosya olurdu package.json. Örneğin, bu kod bir testHelper.tsdosyaya kaydedilebilir ve mocha: kullanılarak çağrılabilir scripts: { test-setup: 'mocha --compilers ts:ts-node/register,tsx:ts-nocde/register --require testHelper.ts --reporter progress' }.
jmbertucci

4

testURL: "http://localhost"Jest yapılandırmamı eklemenin en üst düzey cevabındaki öneri benim için işe yaramadı. Bununla birlikte, jsdom GitHub tartışmasından , jsdom nesnesini oluştururken bir URL geçirme önerisi yaptı.

const url = 'http://localhost';

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


0

Bu aptalca gelebilir, ancak benim için sorun yanlışlıkla rastgele paketler yüklediğimden kaynaklandı npm update. Koşuyordum npm installve sonra npm updateama sadece koştum gerekirdi npm install. node_modulesDizini silerek ve npm installtekrar çalıştırarak sorunu çözdüm .


Bu benimle ilgili, aslında npm installkurumsal proxy nedeniyle düzgün bir şekilde bitiremedim . Yani, desen tamamlanmamış olacağını npm installation
Z. Khullah

0

React JS ile çalışırken hiçbir şey yapmanıza gerek yoktur. JEST'in yerleştirilmesi ve test ortamının kurulması, create-tepki uygulaması için varsayılan davranıştır. Aşağıdakilerin çalışmasında test başarısını göstermeye başlar veya başarısız olur,

npm testi

Test kapsamı istiyorsanız, package.json dosyasına aşağıda eklemeniz yeterlidir

"test": "tepki-scriptleri test --coverage" Şimdi package.json'un "betiğiniz",

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

}


0

Entegre olduğunda bu bana açıldı enzymeile jest. Github Sayı Tartışma yukarıda belirtildiği gibi yani ekleyerek aynı anlaşılacağı

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

jest yapılandırmasına. Bununla birlikte, bunun enzim tarafından da tetiklendiğini bilmek iyidir. Benim için React v15 ve v15 adaptörü oldu.


0

Aynı sorunu var ve bu benim package.jsondosyaya yerleştirmek benim için çalıştı:

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

0

Hatayı çözmek için parçayı package.json dosyanıza Jest SecurityError: localStorageeklemeniz gerekirjest: { ... }

{

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

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

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.