javascript - जेस्ट सुरक्षा त्रुटि:स्थानीय स्टोरेज अपारदर्शी उत्पत्ति के लिए उपलब्ध नहीं है




node.js npm jestjs (5)

जब मैं अपने प्रोजेक्ट को कमांड 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>)

Answers

आपको यह निर्दिष्ट करना होगा कि आप किस पर्यावरण ( --env ) का उपयोग करने जा रहे हैं।

जब आप jest में jest कमांड चलाते हैं तो आपको पर्यावरण ( jsdom या node ) निर्दिष्ट करना चाहिए। उदाहरण के लिए:

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

यह आपके लिए काम करना चाहिए!


यदि आप jsdom का उपयोग कर रहे हैं, तो सुनिश्चित करें कि आप यूआरएल शामिल हैं।

चेकआउट jsdom भंडार सरल विकल्प। https://github.com/jsdom/jsdom#simple-options

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

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

मैं बस एक बड़े monorepo में (यह इकाई परीक्षणों में, कि अन्यथा jsdom की आवश्यकता नहीं होगी) में फसल हो रही थी। हमारे jest.config.js (या package.json समकक्ष) में निम्नलिखित को स्पष्ट रूप से सेट करना उस समस्या को कम करता है:

module.exports = {
  testEnvironment: 'node'
}

अद्यतन: नीचे निकोलस के रूप में उल्लेख किया गया है (धन्यवाद!), यदि आप किसी भी कॉन्फ़िगरेशन फ़ाइलों का उपयोग नहीं कर रहे हैं तो आप निम्न झंडे भी जोड़ सकते हैं:

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

यदि आप 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/",

    // ...
  }]
}

import React, { Component, PropTypes } from 'react';

यह कहता है:

नाम के तहत 'react' से डिफ़ॉल्ट निर्यात आयात करें उसी नाम के तहत नामित निर्यात Component और PropTypes को आयात और आयात करें।

यह उन दो सामान्य वाक्यविन्यासों को जोड़ता है जिन्हें आपने शायद देखा है

import React from 'react';
import { Component, PropTypes } from 'react';

पहला निर्यात डिफ़ॉल्ट निर्यात को आयात और नामित करने के लिए किया जाता है, दूसरा निर्दिष्ट नाम निर्यात आयात करने के लिए।

एक सामान्य नियम के रूप में, अधिकांश मॉड्यूल या तो एकल, डिफ़ॉल्ट निर्यात, या नामित निर्यात की एक सूची प्रदान करेंगे। एक मॉड्यूल के लिए यह एक डिफ़ॉल्ट निर्यात और नाम निर्यात दोनों प्रदान करने के लिए कुछ हद तक कम सामान्य है। हालांकि, इस मामले में जहां एक सुविधा है जो सबसे अधिक आयात की जाती है, लेकिन अतिरिक्त उप-विशेषताओं, यह डिफ़ॉल्ट रूप से निर्यात करने के लिए एक वैध डिजाइन है, और शेष नाम निर्यात के रूप में। ऐसे मामलों में आप import सिंटैक्स का उपयोग करेंगे जिसका आप उल्लेख करते हैं।

अन्य उत्तर गलत और उलझन में कहीं भी हैं, संभवतः क्योंकि इस सवाल से पूछे जाने पर एमडीएन दस्तावेज़ गलत और भ्रमित थे। एमडीएन ने उदाहरण दिखाया

import name from "module-name";

और कहा कि name "ऑब्जेक्ट का नाम है जो आयातित मान प्राप्त करेगा।" लेकिन यह भ्रामक और गलत है; सबसे पहले, केवल एक आयात मूल्य है, जिसे "प्राप्त" किया जाएगा (क्यों न केवल "असाइन किया गया", या "संदर्भित करने के लिए उपयोग किया जाता है") name , और इस मामले में आयात मूल्य डिफ़ॉल्ट निर्यात है मॉड्यूल।

यह समझाने का एक और तरीका यह ध्यान रखना है कि उपरोक्त आयात ठीक समान है

import { default as name } from "module-name";

और ओपी का उदाहरण बिल्कुल समान है

import { default as React, Component, PropTypes } from 'react';

उदाहरण दिखाने के लिए एमडीएन दस्तावेज चला गया

import MyModule, {foo, bar} from "my-module.js";

और दावा किया कि इसका मतलब है

एक संपूर्ण मॉड्यूल की सामग्री आयात करें, कुछ को स्पष्ट रूप से नामित किया जा रहा है। यह वर्तमान क्षेत्र में myModule (sic), foo , और bar myModule । ध्यान दें कि foo और myModule.foo समान हैं, जैसे कि bar और myModule.bar

एमडीएन ने यहां क्या कहा, और गलत एमडीएन दस्तावेज के आधार पर अन्य उत्तर दावा क्या है, यह बिल्कुल गलत है, और यह spec के पहले संस्करण पर आधारित हो सकता है। यह वास्तव में क्या करता है

डिफ़ॉल्ट मॉड्यूल निर्यात और कुछ स्पष्ट रूप से निर्यात निर्यात आयात करें। यह वर्तमान क्षेत्र में MyModule , foo , और bar MyModuleनिर्यात नाम foo और bar MyModule माध्यम से उपलब्ध नहीं हैं , जो डिफ़ॉल्ट निर्यात है, कुछ निर्यात को कवर नहीं करता है।

(डिफ़ॉल्ट मॉड्यूल निर्यात export default वाक्यविन्यास के साथ निर्यात किया गया मान है, जो export {foo as default} ।)

एमडीएन दस्तावेज लेखकों को निम्नलिखित रूप से भ्रमित हो गया हो सकता है:

import * as MyModule from 'my-module';

यह my-module से सभी निर्यात आयात करता है, और उन्हें MyModule.name जैसे नामों के तहत सुलभ बनाता है। डिफ़ॉल्ट निर्यात MyModule.default रूप में भी सुलभ है, क्योंकि डिफ़ॉल्ट निर्यात वास्तव में नाम default साथ किसी अन्य नामित निर्यात से अधिक कुछ नहीं है। इस वाक्यविन्यास में, नामित निर्यात का केवल एक सबसेट आयात करने का कोई तरीका नहीं है, हालांकि कोई भी डिफ़ॉल्ट निर्यात आयात कर सकता है, यदि कोई है, तो सभी नामित निर्यात के साथ,

import myModuleDefault, * as myModule from 'my-module';




javascript node.js npm jestjs