Jsdom: jest: SecurityError: localStorage غير متاح للأصول المعتمة

تم إنشاؤها على ٢٧ يوليو ٢٠١٨  ·  80تعليقات  ·  مصدر: jsdom/jsdom

عندما أقوم بتشغيل jest مع حالات الاختبار الخاصة بي. يظهر الخطأ التالي عندما أقوم بترقية الحزمة. في حالات الاختبار الخاصة بي ، لا يتم استخدام التخزين المحلي. كيف يمكنني حل هذه المشكلة؟

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


working as intended

التعليق الأكثر فائدة

gokulkrishh قمت بتعيينه على http://localhost/ ولكن يبدو أن أي عنوان URL صالح يعمل.

ال 80 كومينتر

ملخص المناقشة أدناه:

  • يتمثل الإصلاح في تعيين عنوان URL لـ jsdom الخاص بك ، والذي قد يلزم إجراؤه من خلال تكوين بيئة الاختبار الخاصة بك. عنوان URL الافتراضي ، " about: blank " ، سيتسبب في حدوث أخطاء عند محاولة الوصول إلى localStorage.
  • غالبًا ما يكون السبب الجذري هو قيام المكتبات بعمل حلقات فوق كل خصائص jsdom وإضافتها إلى global ؛ حتى إذا لم تستخدم localStorage مطلقًا في اختباراتك ، فإن بعض المكتبات أو إطار عمل الاختبار الذي تعتمد عليه "تستخدمه" بهذه الطريقة. لاحظ أن تقنية التكرار والنسخ هذه غير مدعومة بشكل صريح ، لذا فليس من المستغرب أن الكود الذي يفعل ذلك قد ينكسر في إصدار ثانوي.

نص التعليق أدناه على السؤال عما إذا كان هذا "تغييرًا مفاجئًا" ، والذي تم إخفاؤه منذ ذلك الحين بواسطة ميزة "رؤية المزيد من التعليقات" في GitHub:

شكرًا ، لكن اعتبارًا من هذا الوقت لا أعتقد أن هذا هو أفضل طريق للمضي قدمًا. ليس تغييرًا جذريًا بالنسبة لـ jsdom لتنفيذ ميزات منصة الويب الجديدة ؛ هذه نسخة ثانوية.

من الممكن للمُعالين ، حتى المُعالين المستخدَمين على نطاق واسع ، كتابة رمز مؤسف يكتشف ميزات جديدة ويطرح استثناءً إذا ظهرت. آمل أن نتفق جميعًا على أنه حتى في حالة وجود هؤلاء المعالين ، يجب ألا يتخلى jsdom إلى الأبد عن إضافة ميزات جديدة في الإصدارات الثانوية.

الوضع هنا ليس بهذا القدر من الخطورة ، لكن يبدو أنه مشابه. لم أر أي شخص يتتبع رمز Jest المخالف حتى الآن ، لذلك من الصعب تحديده بالضبط ، ولكن يبدو أنهم يقومون بعملية تم كسرها صراحةً من خلال المسار العادي لتطوير jsdom ، والتي لن تعمل على الويب المتصفح الذي يطبق localStorage.

أدرك أن هذا موقف صعب بالنسبة لأولئك منكم المتأثرين ، بدون خطأ من جانبك ، بالتفاعل المؤسف فيما يتعلق بكيفية اعتمادك المباشر (ab) على اعتمادك غير المباشر. لكنني آمل أنه يمكن معالجة ذلك على المستوى الصحيح ، لإصلاح كود Jest's buggy ، بدلاً من إزالة ميزة مفيدة من جميع مستخدمي jsdom بسبب أخطاء أحدهم.

الرد الأصلي على OP ، للسياق:

من المحتمل أنك لم تقم بتعيين عنوان URL في اختباراتك ، ولكنك ، أو ربما Jest ، تقوم بالوصول إلى window.localStorage . قد يعرف مشرفو Jest المزيد عن أفضل إصلاح ، لكنني أسمع أن هناك طريقة لتعيين عناوين URL في اختبارات Jest الخاصة بك؟

هذه مشكلة حديثة جدًا ويبدو أنها ظهرت مع 11.12.0 . أحصل على نفس هذه الأخطاء عند استخدام jest مع enzyme .

نعم ، لقد بدأت في مواجهة المشكلة بعد الترقية من 11.11.0 إلى 11.12.0 . يؤدي تعيين testURL في تكوين jest إلى إصلاح المشكلة.

@ ben-mckernan مرحبًا ، ما هو عنوان URL الذي قدمته لإصلاح هذا ؟؟

gokulkrishh قمت بتعيينه على http://localhost/ ولكن يبدو أن أي عنوان URL صالح يعمل.

أعتقد أن هذا ربما يكون خاصًا بالإنزيم ، لأن الإنزيم يفعل

هذا كسر بالنسبة لي أيضا :(

@ بن مكيرنان شكرا 👍

(سيتم وضع علامة على التعليقات "+1" على أنها رسائل غير مرغوب فيها ؛ ولن يفيد إرسال بريد إلكتروني إلى جميع المشاركين في سلسلة المشكلة.)

اعتذارات. مجرد محاولة للمساعدة.

يمكن تأكيد إضافة testURL إلى jestConfig كما اقترح @ ben-mckernan أنه تم إصلاحه.

ونحن نستخدم الإنزيم أيضًا ، إذا كان ذلك يساعد في تأكيد حدسك.

بالنسبة لاختبار تطبيق الإلكترون ، قمت فقط بضبطه على "file: /" والذي يعمل أيضًا.

miamollie لقد أضفت testURL وفقًا لاقتراح @ ben-mckernan (باستخدام Jest + Enzyme ، لست متأكدًا من ارتباط الإنزيم. خطأ قادم من jest-environment-jsdom الذي يستخدم jsdom). بسبب ذلك فشلت بعض ملفات الاختبار الأخرى الخاصة بي. لمعلوماتك فقط. انظر إذا كان يعمل من أجلك. قد تكون حالات الاختبار الخاصة بك مختلفة عن حالاتي (قد يعمل TestURL من أجلك).

@ دومينيك أنا أستخدم المزاح فقط. لذلك لست متأكدًا من أنها مشكلة تتعلق بالإنزيم.

gokulkrishh نعم ، نفس الشيء ، لقد أوقف خطأ أمان

@ حل بن مكيرنان إصلاحه. شكرا!

@ ben-mckernan أنا أستخدم المزاح في إعداد زاوية (مع jest-preset-angular) ، نفس الخطأ ، نفس الحل. لذلك فهي ليست مشكلة إنزيم.

يبدو أن Jest يحتاج إلى تغيير القيمة الافتراضية testURL حتى يتم تخفيف ذلك (حاليًا هو about:blank ).

DcsMarcRemolt كنت Jest يستخدم وحدة الاعتماد دعت jest-environment-jsdom في package.json لها -> "jsdom": "^11.5.1" الإقحام (^) بسبب هذه الآلية الوقائية الوطنية بتثبيت jsdom كما 11.12.0 (وهي النسخة الجديدة المنشورة اليوم). لذلك كسر لمعظم المستخدمين. تم إنشاء المشكلة بالفعل في الدعابة وتم ربطها هنا. احترس من ذلك.

سأعيد فتح هذه المشكلة لإبرازها بشكل أكبر. انظر التعليق الأول من Domenic للحصول على حل.

إضافة ما يلي إلى تهيئة jest في package.json:
"testEnvironment": "node"
يحل المشكلة بالنسبة لي.
الائتمان إلى @ blu3printchris للمساعدة في حل هذه المشكلة.

لم يعد بإمكاني الكتابة فوق تطبيق JSDOM والسخرية منه على localStorage منذ هذا التحديث.

نظرًا لأن هذا كان تغيير كسر غير مقصود لكثير من الأشخاص ، فربما يكون أفضل خيار للتحكم في الضرر هو:

  • التراجع عن هذا التغيير.
  • قم بتحرير النسخة 11.12.1 بالتغيير المعاد لاستعادة السلوك المتوقع.
  • سحب أو إيقاف الإصدار 11.12.0 مع تحذير.
  • إذا كان السلوك الجديد مطلوبًا كما هو ، فقم بتحرير 12.0.0 للإشارة إلى وجود تغيير فاصل.

شكرًا ، لكن اعتبارًا من هذا الوقت لا أعتقد أن هذا هو أفضل طريق للمضي قدمًا. ليس تغييرًا جذريًا بالنسبة لـ jsdom لتنفيذ ميزات منصة الويب الجديدة ؛ هذه نسخة ثانوية.

من الممكن للمُعالين ، حتى المُعالين المستخدَمين على نطاق واسع ، كتابة رمز مؤسف يكتشف ميزات جديدة ويطرح استثناءً إذا ظهرت. آمل أن نتفق جميعًا على أنه حتى في حالة وجود هؤلاء المعالين ، يجب ألا يتخلى jsdom إلى الأبد عن إضافة ميزات جديدة في الإصدارات الثانوية.

الوضع هنا ليس بهذا القدر من الخطورة ، لكن يبدو أنه مشابه. لم أر أي شخص يتتبع رمز Jest المخالف حتى الآن ، لذلك من الصعب تحديده بالضبط ، ولكن يبدو أنهم يقومون بعملية تم كسرها صراحةً من خلال المسار العادي لتطوير jsdom ، والتي لن تعمل على الويب المتصفح الذي يطبق localStorage.

أدرك أن هذا موقف صعب بالنسبة لأولئك منكم المتأثرين ، بدون خطأ من جانبك ، بالتفاعل المؤسف فيما يتعلق بكيفية اعتمادك المباشر (ab) على اعتمادك غير المباشر. لكنني آمل أنه يمكن معالجة ذلك على المستوى الصحيح ، لإصلاح كود Jest's buggy ، بدلاً من إزالة ميزة مفيدة من جميع مستخدمي jsdom بسبب أخطاء أحدهم.

شكرا للتوضيح. أوافق على أنه إذا كانت المشكلة ناتجة عن استخدام jsdom بطريقة غير مدعومة كما هو موضح أعلاه ، فهذا ليس انتهاكًا تقنيًا ويجب أن تطلق الدعابة تصحيحًا.

الحل البديل الخاص بي ، استخدم قائمة سوداء عند تكرار جميع خصائص


الرمز

const { JSDOM } = require('jsdom');
const Node = require('jsdom/lib/jsdom/living/node-document-position');

// We can use jsdom-global at some point if maintaining these lists is a burden.
const whitelist = ['HTMLElement', 'Performance'];
const blacklist = ['sessionStorage', 'localStorage'];

function createDOM() {
  const dom = new JSDOM('', { pretendToBeVisual: true });
  global.window = dom.window;
  global.Node = Node;
  global.document = dom.window.document;
  // Not yet supported: https://github.com/jsdom/jsdom/issues/317
  global.document.createRange = () => ({
    setStart: () => {},
    setEnd: () => {},
    commonAncestorContainer: {
      nodeName: 'BODY',
      ownerDocument: document,
    },
  });
  global.navigator = {
    userAgent: 'node.js',
  };

  Object.keys(dom.window)
    .filter(key => !blacklist.includes(key))
    .concat(whitelist)
    .forEach(key => {
      if (typeof global[key] === 'undefined') {
        global[key] = dom.window[key];
      }
    });
}

module.exports = createDOM;


لا تضع jsdom globals على Node global

حسنًا ، لقد مررت الآن. أحتاج إلى إجراء الاختبارات في jsdom وفي المتصفحات الحقيقية. إنه أبسط نهج يمكنني التفكير فيه ، لقد كان يعمل منذ سنوات. لا أرى نفس الإمكانات في البدائل المقترحة.
يمكن أن يعمل استخدام jsdom-global أيضًا.

حسنًا ، لقد مررت الآن. أحتاج إلى إجراء الاختبارات في jsdom وفي المتصفحات الحقيقية.

إذا كان بالإمكان إجراء اختباراتك داخل "المتصفحات الحقيقية" ، فيمكنها تشغيلها بنفس الطريقة في jsdom أيضًا - فقط قم بتوفير نفس HTML. من خلال التعيين إلى العام بدلاً من ذلك ، فإنك تقدم تعقيدًا واختلافات إضافية مقارنة بكيفية إجراء الاختبار في المستعرض.

لمعلوماتك ، أواجه نفس المشكلة مع Mocha ، وليس Jest ، بعد ترقية jsdom إلى 11.12.0 .

مرحبًا ، أريد فقط أن أفهم سبب إدخال التغييرات في المقام الأول.

حالات الاستخدام الخاصة بي هي ببساطة لتأكيد وظيفة للتأكد من كتابتها بشكل صحيح ، فهي بسيطة مثل:

const fib = require('./index');

test('Fib function is defined', () => {
  expect(typeof fib).toEqual('function');
});

test('calculates correct fib value for 1', () => {
  expect(fib(1)).toEqual(1);
});

screenshot 2018-07-30 21 10 39

ومع ذلك ، يبدو أن نتيجة الاختبار عبارة عن رسائل خطأ قمت للتو بتنفيذ بعض التطبيقات الكبيرة على React مع مكتبة Redux وأشياء من هذا القبيل ، في حين أن الشيء الحقيقي هو أنني ببساطة اختبر وظيفة بسيطة مثل

//index.js, yes, only one line, no react no redux no enzyme 
function add(a, b) {}

بالمناسبة ، testURL و testEnvironment "hack" لا يعمل معي. هذه مجموعتي. json:

    "jest": {
        "testURL": "http://localhost/",
        "testEnvironment": "node"
    },

لذا فإن سؤالي هو لماذا كل المتاعب لإدخال تغييرات عاجلة بينما في بعض الأحيان نريد فقط عداء اختبار "يعمل" فقط

@ khmy2010 كودك وأسئلتك تتضمن دعابة أكثر مما تفعل jsdom. أقترح عليك إنشاء مشكلة في مستودعهم بدلاً من ذلك.

نفس رسالة الخطأ مع المرجع وتقريباً الجميع هنا (ما عدا أنا لست كذلك
باستخدام الانزيم). إذا لم يكن مرتبطًا ، يجب أن أفتح مشكلة على سبيل الدعابة. آسف على
الذي - التي.

في 30 يوليو 2018 21:32 ، كتب "Zirro" [email protected] :

@ khmy2010 https://github.com/khmy2010 التعليمات البرمجية والأسئلة تتضمن
دعابة أكثر مما يفعلون jsdom. أود أن أقترح عليك إنشاء مشكلة في
المستودع https://github.com/facebook/jest بدلاً من ذلك.

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/jsdom/jsdom/issues/2304#issuecomment-408864079 ، أو كتم الصوت
الخيط
https://github.com/notifications/unsubscribe-auth/AVrB3uOLy7l4JKbStKWPtGi0oHfAaQbYks5uLwrpgaJpZM4Vi8gP
.

إذا كنت تقوم بإنشاء مثيل jsdom بك ، فيمكنك تمرير عنوان url مخصص كمعامل ثانٍ:

const url = 'http://localhost';
const jsdom = new JSDOM('<!doctype html><html><body></body></html>, { url });

قد يكون هذا مفيدًا إذا كنت تستخدم Enzyme + Mochasrodrigo

هذا حطم البنية التحتية القائمة. يجب أن يكون هذا الإصدار 12.0.0 وليس الإصدار الثانوي 11.12.0. يجب ألا تكسر الإصدارات الثانوية الكود الموجود.

يوضح Domenic في هذا التعليق (إذا لم يظهر عند النقر فوق الارتباط ، فمرر لأعلى وقم بتحميل التعليقات المخفية) لماذا لم يُنظر إلى هذا على أنه تغيير فاصل. نأمل أن يتم إصلاح الكود من الحزم التابعة التي تقوم بأشياء لم نشجعها لسنوات من قبل المشرفين عليها قريبًا.

بالإضافة إلى الإصلاح أعلاه ، اضطررت إلى إضافة هذا إلى جذر تكوين الاختبار: --env=jsdom

إضافة ما يلي إلى jest.config.js الخاص بي

testURL: 'http://localhost',

حل المشكلة. شكرا!

(مشرف Jest هنا.) هل تعتقد أنه من المنطقي من منظور Jest التغيير من الافتراضي about:blank إلى مثال localhost ؟

لست متأكدًا مما إذا كنت ذكيًا بما يكفي للتعبير عن رأيي في هذا الأمر ، ولكن من وجهة نظر المطور ، أود أن أقول إن المضيف المحلي أكثر منطقية ، حول: الفراغ هو حالة ليست حقيقة أبدًا. نحن نختبر تطبيقاتنا التي لا تحتوي على أي فارغ

أضاف فريق Jest قيمة افتراضية أكثر ذكاءً لـ testURL : https://github.com/facebook/jest/pull/6792

SimenB أود أن أقول أن هذه فكرة جيدة.

الحصول على نفس الخطأ مثل OP ، ولكن في وضعي كان يسبب الكثير من المشاكل. نقوم بإغلاق إصدارات الحزم التي نستخدمها ، ولا يمكننا تغييرها إلا في بداية دورة الإصدار. نحن حاليًا في نهاية دورة الإصدار ، لذا فإن بيئات المطورين لدينا لديها إصدارات من جميع الحزم وتبعياتها منذ حوالي شهر ، ولكن عندما كان لدينا خادم الإنشاء يقوم بإنشاء بنية ، فقد استحوذ على الإصدار الحالي من الكل الحزم. لذلك ، بينما تجتاز جميع الاختبارات محليًا ، فإنها تفشل جميعها في خادم الإنشاء.

نستخدم الخيار "setupTestFrameworkScriptFile" في ملف التكوين jest لإجراء بعض الإعداد ، بما في ذلك polyfills (من بين أشياء أخرى) localStorage و sessionStorage (نظرًا لأننا نستخدم كليهما في تطبيقنا). إنه أساسًا window.localStorage = window.localStorage || { ... } ، وهو نفس الشيء بالنسبة إلى sessionStorage ، حيث يمثل ... مجموعة من الوظائف الوهمية. الآن لا شيء من هذا يعمل ، حتى لو قمت بتغييره لتجاوز الافتراضي دائمًا ( window.localStorage = { ... } ).

بالإضافة إلى ذلك ، لدينا اختبارات وحدة تختبر على وجه التحديد أشياء مثل sessionStorage.getItem التي يتم الاتصال بها ، ولكن بعد تعيين "testURL" على " http: // localhost " ، كما هو موصى به أعلاه لحل أخطاء التخزين المحلي ، تفشل جميعها. على الرغم من أن لدينا window.sessionStorage.getItem = jest.fn(); ، إلا أن إجراء expect(window.sesssionStorage.getItem).toHaveBeenCalled() لاحقًا يفشل في القول إنها ليست دالة وهمية.

بينما أوافق على أن إضافة ميزة هي تغيير طفيف في الإصدار ، وليس تغييرًا فاصلاً ، عندما يكون شيئًا يمثل جزءًا قياسيًا من المتصفحات ، ويبدو أن التطبيق الجديد لا يمكن تجاوزه أو الاستهزاء به ، فهذا _ يعد تغييرًا مفاجئًا .

الحل الوحيد الذي وجدته لمشكلتي هو إضافة jsdom إلى package.json الخاصة بي وتحديد إصدار 11.11.0. هذا ليس مثاليًا ، وسيتسبب في عمل إضافي لاحقًا عندما نقوم بترقية الحزم مرة أخرى ، ولكن عند الإيجار في الوقت الحالي ، يتم إلغاء حظرنا.

إذا كان لديك رمز ، على سبيل المثال رمز محاكاة ، والذي يعمل في المتصفحات ولكن ليس في jsdom ، فقم بتقديم مشكلة جديدة باتباع نموذج المشكلة ويمكننا التحقيق. على حد علمي ، فإن localStorage في jsdom يمكن الاستهزاء به تمامًا كما هو الحال في المتصفحات.

لا أقترح تشغيل إصدارات مختلفة على خادم الإنشاء الخاص بك لأن المطورين يعملون لديك.

"لا أقترح تشغيل إصدارات مختلفة على خادم الإنشاء الخاص بك لأن المطورين يعملون لديك."

على الرغم من أن هذا يبدو جيدًا من الناحية النظرية ، إلا إذا توقف كل مطور حزم عن استخدام "^" عند تحديد إصدارات التبعية ، أو نلتزم بآلاف المجلدات في مجلد node_modules الخاص بنا ، فلن يحدث ذلك أبدًا. من جهاز مطور إلى آخر ، من المحتمل أن تكون هناك اختلافات طفيفة في بعض التبعيات بمستوى أو اثنين لأسفل. كل ما يمكنني فعله هو تحديد الإصدارات الدقيقة للحزم التي تعد تبعيات مباشرة لتطبيقنا.

أتفق تمامًا مع mrobrian حول "^". الشيء الأكثر جنونًا على الإطلاق. يجب أن تزيل npm بهذه الطريقة لوصف التبعيات.

domenic الحل البديل مع packge-lock.json و yarn.lock معطل حسب التصميم. ربما يساعد في الإصدارات ، ولكن بعد ذلك يخلق مشاكل أخرى مع مراجعة التعليمات البرمجية والدمج وغالبًا ما تحتاج إلى إعادة إنشاء هذا الملف عن طريق الحذف. لا بأس إذا كان نادرًا ما يتم تحديث التبعيات ، لكننا نقوم بالتحديث كثيرًا.

لذلك لدينا .npmrc :

save-exact = true
package-lock = false

لقد ساعدني في إضافة هذه الأسطر الجديدة إلى package.json:

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

إذا كنت تستخدم jsdom ، فتأكد من تضمين عنوان url

const dom = JSDOM الجديد (`` ، {
عنوان url: "https://example.org/" ،
}) ؛

هل يرغب مطورو الدعابة في التعليق على سبب طلب "testEnvironment": "node" الآن لمشاريع CLI / العقدة (لتجنب الخطأ localStorage ) عندما لم يكن ذلك مطلوبًا في السابق؟ هل هذه حقيب؟

إذا كان هذا بطريقة ما حسب التصميم ، فهو يحتاج حقًا إلى رسالة خطأ أفضل! لقد تلقيت هذا الخطأ في كل من مشروعي اللذين يستخدمان Jest - مشروعان بسيطان بدون متصفح مع القليل من التبعيات. هم بالتأكيد لا يستخدمون jsdom / localStorage.

هذا ليس المكان المناسب لطرح الأسئلة على مطوري Jest - jsdom هو مشروع منفصل. ومع ذلك ، تحتوي التعليقات أعلاه بالفعل على إجابات لأسئلتك.

package.json

   ...
  "jest": {
    "testEnvironment": "node",
    "roots": [
      "test/javascript"
    ]
  },

إنه يعمل بالنسبة لي.

@ p8ul كان على حق ، لا تنس تحديد " http: // localhost " (محدد موقع URL الافتراضي منذ Jest 23.5.0 ، راجع # 6792):

const dom = new JSDOM(``, {
url: "http://localhost",
});

كل شيء يعمل بالنسبة لي.
لا تحتاج حتى إلى إضافة:

"testEnvironment": "node"

يتضمن jest 23.5.0 الآن إصلاحًا لذلك ، لذا لم تعد هناك حاجة إلى الحلول البديلة:

https://github.com/facebook/jest/issues/6766#issuecomment -412516712

مشابهة لـ @ mica16 https://github.com/jsdom/jsdom/issues/2304#issuecomment -412663502

const dom = new JSDOM(``, {
  url: "http://localhost",
});

كان التغيير الوحيد الذي احتجنا إلى إجرائه لتجنب هذا الخطأ.

نحن نستخدم المخاوي / الإنزيم. لا توجد مزحة مدرجة في مجموعة الاختبار الخاصة بنا.

تعيين --env node في سطر الأوامر يعمل أيضًا.

gokulkrishh قمت بتعيينه على http://localhost/ ولكن يبدو أن أي عنوان URL صالح يعمل.

سيكون موقع "location.href" رائعًا إذن. :)

domenic أوصي بتحديث تعليقك في الجزء العلوي ليقول إن مشرفو Jest قاموا بإصلاح هذا الخطأ في الإصدار 23.5.0: https://github.com/facebook/jest/issues/6766#issuecomment -412516712

ألتزم بإعداد testURL لـ jest-config إلى http://localhost workes.

أضف مفتاحًا في ملف التكوين وحاول مرة أخرى "jest": {"testURL": " http: // localhost٪ 26quot٪ 3B / } ،
استخدم منفذ IP بدلاً من المضيف المحلي
هذا قد يحل المشكلة

لقد واجهت المشكلة بعد اكتشاف بعض مشكلات الأمان عند تشغيل npm audit . بعد إصلاحها باستخدام npm audit fix واجهت هذه المشكلة.

نظرًا لأن هذا تم إصلاحه في Jest لبعض الوقت ، فلنحاول إغلاقه ومعرفة ما إذا كنا سننتهي بالكثير من التكرارات ، أو ما إذا كانت الأمور قد استقرت بشكل كافٍ.

"دعابة": {
"مطول": صحيح ،
"testURL": " http: // localhost / "
}
أضف مقتطف الشفرة هذا في ملف package.json.
عملت معي.

يمكنك أيضًا إضافة هذا إلى الاختبار المتأثر إذا لم تكن هناك حاجة إلى jsdom هناك

"" جافا سكريبت 1.6
/ **

  • @ عقدة jest-environment
    * /

هو ('اختباري' ، () => {
توقع (2 + 2) .toBe (4) ؛
}) ؛
""

لقد اختبرت كلا الخيارين:

1) أضف هذا إلى أعلى ملف اختبار:

/**
 * @jest-environment node
 */

2) أضف هذا المقطع إلى package.json:

"jest": {
    "testURL": "http://localhost/"
  }

كلا الخيارين يعمل.

لقد نجحت في ذلك عن طريق إضافة ملف package.json:

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

gokulkrishh لقد قمت بتعيينه على http: // localhost / ولكن يبدو أن أي عنوان URL صالح يعمل.

أنا مبتدئ. هل يمكن أن تخبرني أين بالضبط في Jest.config.js أنني قمت بتعيين testURL؟

haiphu Anywhere في jest.config.js مثل أدناه

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

// Your other config
}

لقد أضفت أدناه إلى الحزمة الخاصة بي. json وهي تعمل بشكل جيد الآن :)

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

لست متأكدًا من السبب ، ولكن خطأي كان ناتجًا عن وجود إصدارات مختلفة من الكتابة المطبوعة.

لدي إعداد أحادي الريبو مع مساحات عمل الغزل + lerna. كل الحزم بها typescript@^3.3.3 في عبوتها. json. أضفت حزمة جديدة وقمت بتثبيت أحدث typescript@^3.5.3 . عندما أجريت الاختبارات في الحزم الحالية ، تلقيت هذا الخطأ.

إذا قمت بنقل جميع الحزم إلى نفس الإصدار - إما typescript@^3.3.3 أو typescript@^3.5.3 ، فسيختفي الخطأ. لم يكن علي العبث بـ testURL .

@ tylerreece22gokulkrishh عملت بالنسبة لي! 😄

لأولئك الذين يتساءلون عما يفعله توجيه تكوين jest testURL ، راجع https://jestjs.io/docs/en/configuration#testurl -string

بالنسبة لأولئك الذين يحددون الخيارات على jsdom مباشرة (عند استخدام Mocha على سبيل المثال). ضع هذا في ملف setup.js الخاص بك:

let jsdom = require('jsdom-global')(
    undefined,
    {
        url: "http://localhost"
    }
);

الغريب .. ليس لدي jsdom قيد الاستخدام .. أنا أستخدم الدعابة لاختبار بعض حزم العقدة فقط ، لكن هذا الخطأ بدأ في حظر CI عند ترقية إصدارات jest إلى الأحدث ضمن نطاق ^11 .. أنا متأكد من الأشخاص الآخرين تواجه مشكلات مماثلة .. لا يبدو أن أيًا من التغييرات الموصى بها حتى الآن يعمل على حلها

إذا كنت لا تستخدم jsdom فأنت تريد تعيين خاصية تكوين jest testEnvironment إلى node . (لا حاجة للمس testURL )
https://jestjs.io/docs/en/configuration#testenvironment -string

لأي شخص يبحث عن الإصلاح الفعلي ، فهو new JSDOM('', { url: 'https://localhost' })

حاول استخدام هذا في ملف package.json الخاص بك

"دعابة": {
"مطول": صحيح ،
"testURL": " http: // localhost / "
}

لماذا لا يعمل تعيين عنوان url بالنسبة لي ... أنا أستخدم رد فعل أصلي .. هل هناك أي شيء آخر مفقود؟

لماذا لا يعمل تعيين عنوان url بالنسبة لي ... أنا أستخدم رد فعل أصلي .. هل هناك أي شيء آخر مفقود؟

كان لدينا نفس القضية. في تطبيقنا كان لدينا هذا الرمز

const { JSDOM } = require('jsdom');
const jsdom = new JSDOM('<!doctype html><html><body></body></html>');

تبين أنه كان علينا إضافة عنوان URL إلى مُنشئ JSDOM

const { JSDOM } = require('jsdom');
const jsdom = new JSDOM('<!doctype html><html><body></body></html>', {
  url: 'http://localhost/',
});

أن حل المشكلة.

لماذا لا يعمل تعيين عنوان url بالنسبة لي ... أنا أستخدم رد فعل أصلي .. هل هناك أي شيء آخر مفقود؟

كان لدينا نفس القضية. في تطبيقنا كان لدينا هذا الرمز

const { JSDOM } = require('jsdom');
const jsdom = new JSDOM('<!doctype html><html><body></body></html>');

تبين أنه كان علينا إضافة عنوان URL إلى مُنشئ JSDOM

const { JSDOM } = require('jsdom');
const jsdom = new JSDOM('<!doctype html><html><body></body></html>', {
  url: 'http://localhost/',
});

أن حل المشكلة.

هذا عمل لي شكرا جزيلا لك! لا يبدو أن وضع عنوان url في التكوين الدعائي يعمل مع التفاعل الأصلي. وضع عنوان url في de jsdom المنشئ فعل الحيلة.

تحديث الدعابة من 22 إلى 26 مشكلة ثابتة.

ما عليك سوى استخدام أحدث إصدار من المزاح. أستخدم حاليًا 26.5.0 في عام 2020 وتم حل مشكلتي

حاول استخدام هذا في ملف package.json الخاص بك

"دعابة": {
"مطول": صحيح ،
"testURL": " http: // localhost / "
}

هذا testURL هو عنوان URL الافتراضي ، مما يعني أنه لا يحل المشكلة ، على الأقل ليس مع Jest 26.x . كان علي أن أفعل ما فعلته zuccha للالتفاف حوله.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

josephrexme picture josephrexme  ·  4تعليقات

tolmasky picture tolmasky  ·  4تعليقات

kilianc picture kilianc  ·  4تعليقات

domenic picture domenic  ·  3تعليقات

jhegedus42 picture jhegedus42  ·  4تعليقات