Jest SecurityError: localStorage không có sẵn cho nguồn gốc mờ


144

Khi tôi muốn chạy dự án của mình bằng lệnh npm run test, tôi gặp lỗi bên dưới. Điều gì gây ra điều này?

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

Làm thế nào để bạn truy cập ứng dụng của bạn? .. Ý tôi là, bạn đang truy cập nó như thế http://localhost:port...nào?
David R

Đây là vấn đề với người chạy thử, @DavidR, Anh ta có vấn đề với >>> npm chạy thử <<<
Martin Chaov

@MartinChaov Yup Tôi biết điều đó. Tôi muốn xem câu trả lời của anh ấy để kiểm tra xem có gì sai trong jestcấu hình của anh ấy không :-)
David R

1
Tôi mới bắt đầu tự chạy vào đây ... Tôi hoàn toàn không sử dụng bộ nhớ cục bộ trong mã. Mã của bạn có sử dụng ts-jest không?
k2snowman69

@ k2snowman69 Vui lòng kiểm tra câu trả lời của tôi và gửi bình luận của bạn.
David R

Câu trả lời:


139

Trong trường hợp, nếu bạn đang truy cập ứng dụng của mình bằng một http://localhost tiền tố, bạn cần cập nhật cấu hình jest (trong của bạn jest.config.js) là,

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

Trong trường hợp bạn chưa có bất kỳ cấu hình jest nào, chỉ cần bao gồm cấu hình trong package.json . Ví dụ:

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

hoặc trong jest.config.js :

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

hoặc nếu bạn đã projectscấu hình:

module.exports = {
  verbose: true,

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

    // ...
  }]
}

17
Đúng, nó hoạt động với tôi ... mặc dù tôi không hiểu tại sao tôi cần cái này hay tại sao nó lại hoạt động trước khi nâng cấp mới nhất
k2snowman69

1
Điều này được thảo luận trong jesttrang github: github.com/facebook/jest/issues/6766
Jordan Bonitatis

2
Bạn cũng có thể sử dụng tùy chọn cli trong tập lệnh npm của mình : jest --testURL=\"http://localhost\". Hữu ích nếu bạn không thể đặt cấu hình jest toàn cầu vì môi trường khác (tập lệnh phản ứng cho tôi).
Burrich

Tôi đang làm việc trên phản ứng bản địa. Ngay cả đối với tôi testUrlđã làm việc.
Jimit Patel

78

Tôi vừa mới cắt xén này trong một bài hát lớn (trong các bài kiểm tra đơn vị, nếu không thì sẽ không cần jsdom). Hoàn toàn thiết lập những điều sau đây trong jest.config.js(hoặc package.jsontương đương) của chúng tôi cũng làm giảm bớt vấn đề đó:

module.exports = {
  testEnvironment: 'node'
}

Cập nhật: Như Nicolas đã đề cập bên dưới (cảm ơn!), Bạn cũng có thể thêm các cờ sau nếu bạn không sử dụng bất kỳ tệp cấu hình nào:

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

3
Điều này làm việc cho tôi! Đây là câu trả lời bạn cần! Cảm ơn!
bản thiết kế

Có vẻ như tác giả có môi trường nút - trong trường hợp của mình, anh ta nên đặt testEn Môi trường: "jsdom". Điều này làm việc cho tôi với bản cập nhật mới nhất. Cảm ơn lời khuyên của bạn!
Philipp Möhler

3
Như đã đề cập trong một số câu trả lời khác bên dưới, bạn có thể bỏ qua việc tạo tệp cấu hình (hoặc thuộc tính pack.json) bằng cách chạy jest --testEnvironment nodehoặc tốc ký của nó jest --env=node, intead.
Nicolás Fantone

2
Đây phải là câu trả lời được chấp nhận. Có vẻ thích hợp hơn cho các lỗi. Ngoài ra nếu bạn chỉ kiểm tra các tập lệnh thì không có nghĩa gì để định nghĩa a testURL.
Dez

16

Bạn phải chỉ định môi trường nào (--env ) bạn sẽ sử dụng.

Khi bạn chạy jestlệnh trong, package.jsonbạn nên chỉ định môi trường ( jsdomhoặc node). Ví dụ:

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

Điều này sẽ làm việc cho bạn!


1
Nếu bạn đang sử dụng jsdom, điều tương tự sẽ xảy ra bất kể bạn có chỉ định envthông qua cấu hình hoặc dòng lệnh hay không. Điều này chỉ bắt đầu xảy ra với bản cập nhật mới nhất của jest ngày hôm nay. Vui lòng xem câu trả lời của @David R để biết giải pháp nếu đây là trường hợp dành cho bạn.
fisch2 27/07/18

7

Nếu bạn đang sử dụng jsdom, hãy đảm bảo bạn bao gồm url.

Thanh toán kho lưu trữ jsdom tùy chọn đơn giản. https://github.com/jsdom/jsdom#simple-options

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

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

Trong trường hợp của tôi, tôi đã thêm mã đó vào tệp cấu hình jsdom của mình. 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 Mặc dù không nói cụ thể về Jest, đây là một giải pháp thay thế và có thể được sử dụng cho các thiết lập khác (vì đây là SO hàng đầu cho mã lỗi, những người khác, như tôi, sẽ tìm thấy trang này không sử dụng Jest) Per @ dspacejs câu hỏi hay, đây sẽ là một tệp riêng biệt được gọi thông qua lệnh kiểm tra của bạn package.json. Ví dụ: mã này có thể được lưu trong một testHelper.tstệp và được gọi bằng mocha : scripts: { test-setup: 'mocha --compilers ts:ts-node/register,tsx:ts-nocde/register --require testHelper.ts --reporter progress' }.
jmbertucci

4

Đề xuất trong câu trả lời được xếp hạng hàng đầu về việc thêm testURL: "http://localhost"vào cấu hình Jest của tôi không phù hợp với tôi. Tuy nhiên, đề xuất này từ cuộc thảo luận về jsdom GitHub , về việc truyền URL khi tạo đối tượng jsdom, đã làm.

const url = 'http://localhost';

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

1

đối với tôi điều này đã được giải quyết bằng cách nâng cấp lên "jest": "^ 24.9.0",


0

Điều này nghe có vẻ ngớ ngẩn, nhưng đối với tôi, vấn đề đã được gây ra bởi vì tôi đã cài đặt nhầm các gói ngẫu nhiên với npm update. Tôi đã chạy npm installvà sau đó npm updatetôi chỉ nên chạy npm install. Tôi đã khắc phục vấn đề bằng cách xóa node_modulesthư mục và chạy npm installlại.


Điều này liên quan đến tôi, tôi thực sự đã không thể hoàn thành npm installđúng do proxy doanh nghiệp. Vì vậy, mô hình sẽ là chưa hoàn thành npm installation
Z. Khullah

0

Bạn không cần phải làm gì khi làm việc với React JS. Đây là hành vi mặc định của ứng dụng tạo phản ứng để đặt JEST và thiết lập môi trường thử nghiệm. Khi chạy bên dưới, nó bắt đầu hiển thị thử nghiệm thành công hay thất bại,

kiểm tra npm

Trong trường hợp bạn muốn bảo hiểm thử nghiệm, bạn chỉ cần thêm bên dưới vào tệp pack.json

"test": "Reac-scripts test - coverage" Bây giờ "script" của pack.json trông như thế nào,

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

}


0

Điều này xuất hiện với tôi khi tích hợp enzymevới jest. Các Github Issue thảo luận cho thấy giống như đã nói ở trên, cụ thể là thêm

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

để cấu hình jest. Tuy nhiên, thật tốt khi biết rằng điều này cũng được kích hoạt bởi enzyme. Đối với tôi đó là React v15 và bộ chuyển đổi v15.


0

Tôi có cùng một vấn đề và đặt nó trong package.jsontập tin của tôi làm việc cho tôi:

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

0

Để giải quyết Jest SecurityError: localStoragelỗi, bạn cần thêm jest: { ... }phần vào tệp pack.json

{

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

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

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.