Sinon: قم بتوثيق كيفية تكوين العقدة للسماح بوحدات EcmaScript النمطية

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

لا يمكن إيقاف وحدات EcmaScript التي تعمل في بيئة تدعمها (مما يعني أنه لم يتم نقلها باستخدام Babel إلى ES5) وتصدير وظيفة default من نوع ما ، لأن مساحات أسماء ES غير قابلة للتغيير وفقًا للمواصفات. لا يوجد شيء يمكن لـ Sinon القيام به حيال ذلك ، لذلك فإننا نخطئ بشكل صريح عندما تحاول القيام بذلك: 'ES Modules cannot be stubbed' .

لكن jdalton صنع esm ، أداة تحميل وقت تشغيل لـ Node تتيح تحميل وحدات EcmaScript ( *.mjs ) ، وللسماح بالإيقاف باستخدام Sinon وما شابه ، أضاف mutableNamespace الخيار ل esm .

يجب أن يكون هناك مقال ضمن قسم " كيفية" يوضح كيف يمكن للمرء إعداد npm لتنفيذ العقدة باستخدام esm والخيار ، جنبًا إلى جنب مع برنامج نصي للاختبار.

مراجع:

Documentation ES2015+ Help wanted good first issue hacktoberfest pinned

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

giltayar تهانينا على تنفيذ دعم ESM! مقالة رائعة ، راجع للشغل. لقد قلنا دائمًا أن إيقاف تشغيل وحدة ES غير ممكن في مطابقة أوقات تشغيل ESM ، لكننا قلنا أيضًا (كما هو مذكور أعلاه) أنه يجب التعامل مع هذا على مستوى الارتباط ، باستخدام شيء مثل proxyquire أو تجديد الأسلاك أو ... حيث أضفت الدعم :)

في مشروع عملي استخدمنا proxyquire لإخراج التبعيات من وحدات ES:

proxyquire('./mylib.mjs', {doSomething: () => 'done'})

سيكون متكافئًا تمامًا في Quibble (يستخدمه TestDouble) ، حيث تحتوي المقالة على مثال مثل هذا ، لكن Quibble لا يدعم التنسيقات الجزئية ، لذا فهو مختلف قليلاً فيما يفعلونه.

await quibble.esm('./mylib.mjs', {doSomething: () => 'done'}, 'yabadabadoing') // not sure what this third param does ...

تمشيا مع ما قيل سابقًا ، لن تضيف Sinon أبدًا دعمًا صريحًا للسخرية من وحدات ES ، حيث من الأفضل ترك ذلك لـ Quibble و Proxyquire و Rewire و NormalModuleReplacementPlugin (webpack) وجميع الطرق الأخرى للقيام بذلك وهي بيئة 100٪ متكل.

ال 17 كومينتر

كنت أفكر في كتابة هذا بالضبط :)

تكمن "المشكلة" في وجود عدد كبير من الطرق المختلفة التي يمكن استخدامها esm ، ولكن يجب علينا على الأقل تغطية الحالة الأكثر شيوعًا ، والتي أفترض أنها من خلال علامة require إلى node . لقد بدأت في توضيح كيفية استخدام ملف التكوين هنا ، ولكن يبدو أنه من الممكن أيضًا توفير سلسلة json كمتغير بيئة أيضًا (بالإضافة إلى تجزئة الخيارات في حالة استخدام التعليمات البرمجية).

مرحبا @ fatso83!

يتم تمكين الخيار cjs.mutableNamespace افتراضيًا ، لذا لا يلزم التهيئة. ستعمل Stubbing مع .js ولكن ليس .mjs _ ( .mjs الملفات مغلقة ، لذلك لا توجد خيارات esm ) _.

jdalton نشكرك على js مقابل mjs . هذا يفسر سبب عدم تمكن هذا الرجل من إنجاحه .

cc @ jim-king-2000

أرغب في كتابة اختبار الوحدة بأقل تكلفة. إذا كان الحل صعبًا للغاية ، فأنا أفضل التخلي عن اختبار الوحدة مع الوهمي. بعد كل شيء ، الاختبار الوهمي ليس الطريقة الضرورية لبناء نظام قوي عبر الإنترنت. ولكن ، كملاذ أخير ، هل من الممكن أن تغلف sinon "proxyrequire" (أو شيء من هذا القبيل) بالنسبة لي؟

@ jim-king-2000 هذا خارج النطاق. لقد اخترت صراحةً استخدام نظام الوحدات النمطية الذي من المفترض أن تكون صادراته غير قابلة للتغيير. هذه تكلفة للأسف عليك أن تتحملها من جانبك. تغليف لوادر الوحدة ، مما يجعلها تعمل في جميع أنواع السيناريوهات (عقدة ، متصفح ، مع / بدون ترانسبيترات ، إلخ) مكلفة للغاية ولا علاقة لها بالأهداف المعلنة لهذا المشروع .

لا أفهم تمامًا أهمية نظام sinon والوحدة النمطية (أنا آسف). ما أحتاجه هو إطار عمل تجريبي لوحدة js / node (أو مكتبة ، مثل نظير جافا ، mockito) بدون برنامج babel. إذن ، هل هو موجود؟

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

من حيث Java ، فإن الأمر يشبه تنفيذ نظامك بالكامل باستخدام أساليب Java static ثم محاولة السخرية من الفصول باستخدام Mockito. لا يمكن أن يتم ذلك.

ومع ذلك ، كل ما تحتاجه لإنجاح الأمور هو إعادة تسمية ملفاتك *.mjs إلى *.js . يبدو هذا وكأنه طريق وسط عملي ، حيث ستكتسب قابلية الاختبار دون أي عيوب معروفة.

من أجل الاستهزاء بوظيفة Java الثابتة ، نستخدم powermock. لكنني قد لا أفهم المقارنة تمامًا. بالمناسبة ، أنا لا أحب الجافا ، التطور بطيء للغاية. الآن فإنه لا يزال لا تدعم المتزامن / ننتظر.

أنا أستخدم * .mjs في كل مكان ، جميع أكواد المصدر هي ملفات mjs. علاوة على ذلك ، فهذا يعني أنني يجب أن ألجأ إلى babel مرة أخرى (تقديم عمل إضافي / وقت تشغيل ومكدس مكالمات فوضوي). لا بأس إذا كان بإمكاني فقط تغيير ملفات الاختبار مرة أخرى إلى * .js.

سأتخلى عن ut with mock (الاختبارات الأخرى سليمة) حتى أجد بعض الطرق الأخرى منخفضة التكلفة.

@ fatso83 شكرا لك على المساعدة طوال الوقت.

هل حاول أي شخص المراوغة ؟ 🤔

لمعلوماتك ، قمت بتطبيق دعم Node.js ESM في "testdouble.js" ، وهي مكتبة محاكاة. إنه ممكن. لقد كتبت عن التنفيذ في منشور المدونة هذا:

https://dev.to/giltayar/mock-all-you-want-supporting-es-modules-in-the-testdouble-js-mocking-library-3gh1

سأكون سعيدًا بالمساعدة هنا إذا أراد أي شخص القيام بذلك ..

giltayar تهانينا على تنفيذ دعم ESM! مقالة رائعة ، راجع للشغل. لقد قلنا دائمًا أن إيقاف تشغيل وحدة ES غير ممكن في مطابقة أوقات تشغيل ESM ، لكننا قلنا أيضًا (كما هو مذكور أعلاه) أنه يجب التعامل مع هذا على مستوى الارتباط ، باستخدام شيء مثل proxyquire أو تجديد الأسلاك أو ... حيث أضفت الدعم :)

في مشروع عملي استخدمنا proxyquire لإخراج التبعيات من وحدات ES:

proxyquire('./mylib.mjs', {doSomething: () => 'done'})

سيكون متكافئًا تمامًا في Quibble (يستخدمه TestDouble) ، حيث تحتوي المقالة على مثال مثل هذا ، لكن Quibble لا يدعم التنسيقات الجزئية ، لذا فهو مختلف قليلاً فيما يفعلونه.

await quibble.esm('./mylib.mjs', {doSomething: () => 'done'}, 'yabadabadoing') // not sure what this third param does ...

تمشيا مع ما قيل سابقًا ، لن تضيف Sinon أبدًا دعمًا صريحًا للسخرية من وحدات ES ، حيث من الأفضل ترك ذلك لـ Quibble و Proxyquire و Rewire و NormalModuleReplacementPlugin (webpack) وجميع الطرق الأخرى للقيام بذلك وهي بيئة 100٪ متكل.

@ fatso83 إذا

لا توجد حلول موثقة في Jest ، ولا توجد حلول هنا. كدت أستسلم حتى وجدت مقالgiltayar. هذه الإغاثة. حصلت على شيء يعمل مع quibble حتى أدركت أنه يمكنني فقط استخدام testdouble.js.

من الصعب بالفعل أن تحتوي كل حزمة في JavaScript على أسلوب التوثيق الخاص بها وفي معظم الأحيان لا توجد مستندات API حقيقية ، ولكن يتعين عليك أيضًا معرفة كيفية عمل مكتبات الاختبار ، وعمل المكتبات الساخرة ومحمل الوحدات النمطية لعمل المكتبات الساخرة هو الكثير جدًا. .

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

ليس لدي مثل هذا الفهم التقني العميق ، لقد اعتقدت فقط أن بعض التعليقات من تجربتي قد تكون مفيدة

@ fatso83 إذا

اسمحوا لي أن أعيد التكرار: رأي المشرفين على Sinon أن التعامل مع الاستهزاء بالواردات هو خارج نطاق Sinon ويتم التعامل معه بشكل أفضل من قبل المكتبات المتخصصة.

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

لا توجد حلول موثقة في Jest ، ولا توجد حلول هنا. كدت أستسلم حتى وجدت مقالgiltayar. هذه الإغاثة. حصلت على شيء يعمل مع quibble حتى أدركت أنه يمكنني فقط استخدام testdouble.js.

تختلف اختيارات المكتبات المختلفة.

يتخذ القائمون على إدارة testdouble.js خياراتهم الخاصة. قرروا نشر مراوغة ودمجها في مكتبتهم. جيد بالنسبة لهم. إذا كنت تحب حلهم ، فاستخدمه بكل الوسائل. ليس لدينا سوى الحب والاحترام لـ searls و

من الصعب بالفعل أن تحتوي كل حزمة في JavaScript على أسلوب التوثيق الخاص بها وفي معظم الأحيان لا توجد مستندات API حقيقية ، ولكن يتعين عليك أيضًا معرفة كيفية عمل مكتبات الاختبار ، وعمل المكتبات الساخرة ومحمل الوحدات النمطية لعمل المكتبات الساخرة هو الكثير جدًا. .

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

لسنا هنا لحل كل مشكلة في نظام JavaScript البيئي.

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

ليس لدي مثل هذا الفهم التقني العميق ، لقد اعتقدت فقط أن بعض التعليقات من تجربتي قد تكون مفيدة

ما سيكون مفيدًا إذا كتبت منشور مدونة حول إحباطاتك تسخر من التبعيات ، حتى توصلت إلى حل يعمل جيدًا بالنسبة لك ، وكيف استخدمت testdouble.js لتحقيق نجاح كبير مع طريقتك الخاصة في تحميل JavaScript.

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

mroderick أعتقد أنه يجب أن أوضح أولاً أنك

لسنا هنا لحل كل مشكلة في نظام JavaScript البيئي.

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

التعامل مع الواردات الساخرة هو خارج نطاق Sinon ويتم التعامل معه بشكل أفضل من قبل المكتبات المتخصصة.

عادل بما فيه الكفاية ، كما قلت ، يمكنني أن أفهم ذلك وربما لديك طريقة لفهم أعمق للجهود التي ينطوي عليها تنفيذ تلك الميزات. كما أن API المحمل لا يزال قيد التجربة.

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

سأحاول استخدام Sinon مع proxyquire قبل ، لأنني قرأت الكثير من الأشياء الجيدة عن Sinon.

لدينا دليل حول كيفية القيام بذلك: https://sinonjs.org/how-to/link-seams-commonjs/

إذا وجدت أنه يمكن تحسين الدليل ، فيرجى إرسال طلب سحب 👍

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