Mocha: دعم اختبارات نمط ES6 دون استخدام الناقل

تم إنشاؤها على ١٨ سبتمبر ٢٠١٧  ·  75تعليقات  ·  مصدر: mochajs/mocha

المتطلبات الأساسية

  • [x] تم التحقق من أن مشكلتك لم يتم تقديمها بالفعل عن طريق مشكلات الإحالة المرجعية مع التصنيف common mistake
  • [x] تم التحقق من مشكلات البنية الأساسية للجيل التالي ومشكلات البنية باستخدام نفس البيئة و / أو تكوين مترجم بدون Mocha للتأكد من أنها ليست مجرد ميزة غير مدعومة في الواقع في البيئة المعنية أو خطأ في التعليمات البرمجية الخاصة بك .
  • [x] "اختبار الدخان" الكود الذي سيتم اختباره عن طريق تشغيله خارج مجموعة الاختبار الحقيقية للحصول على فكرة أفضل عما إذا كانت المشكلة في الكود قيد الاختبار ، أو استخدامك لـ Mocha ، أو Mocha نفسها
  • [x] تم التأكد من عدم وجود تعارض بين الإصدارات المثبتة محليًا وعالميًا من Mocha. يمكنك العثور عليها مع:
    node node_modules/.bin/mocha --version (محلي) و mocha --version (عالميًا). نوصي بتجنب استخدام موكا المثبتة عالميًا.

وصف

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

الآن بعد أن دعمت العقدة تشغيل وحدات EMCAScript (نعم ، أعلم أنها تجريبية) سيكون من الرائع رؤية mocha تعمل جنبًا إلى جنب مع تعريفات الاختبار mjs .

خطوات التكاثر

لدي اختبار بسيط جدا

describe('Test', function () {
});

التي قمت بحفظها كـ test.js و test.mjs

السلوك المتوقع: أود أن يظهر كلا الاختبارين

- test/test.js 
  0 passing (1ms)
(node:70422) ExperimentalWarning: The ESM module loader is experimental.

السلوك الفعلي: بينما يعمل الاختبار js mjs

- test/test.mjs 
module.js:658
    throw new errors.Error('ERR_REQUIRE_ESM', filename);
    ^

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /Users/dgehl/Repositories/LOreal/code/ecom-lora/test/frontend/components/global/test.mjs

تتكاثر كم مرة: 100٪

إصدارات

node --version - v8.5.0
mocha --version - 3.5.3

معلومة اضافية

أعتقد أن هذا قد يكون أن عداء mocha يستخدم Commonjs و nodejs 'التنفيذ الحالي لا يسمح باستخدام وحدات ECMAScript من سياق Commonjs.

من فضلك لا ترد بعبارة "استخدام ناقل" ، أريد صراحة عدم استخدام واحد.

تحرير: في إصدار سابق استخدمت jsx عن طريق الخطأ بدلاً من mjs.

feature usability

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

قمنا بتطبيق دعم ESM الأصلي الخاص بـ Node في Mocha v7.1.0.

ال 75 كومينتر

الأفكار الأولية من أعلى رأسي ، قبل إجراء أي بحث إضافي:

  • يبدو أنني أتذكر أن الأشخاص Node قد تم تغيير المعيار على وجه التحديد للسماح بالتوافق مع الإصدارات السابقة مع وحدات CommonJS. إذا كان هذا (لا يزال؟) صحيحًا ، فأنا أتوقع أنه سيتم دعمه في النهاية دون الحاجة إلى فعل أي شيء مع / إلى Mocha. (وبعبارة "في النهاية" أعني "ربما تكون أسرع من تغييرات Mocha" ، بالنظر إلى معدل دورة إطلاق Node ؛ انظر التأكيد ، قبل الأخير أدناه للحصول على شرح أكثر تفصيلاً لهذا.)
  • هل يمكنني أن أفترض أن هذا تم تشغيله مثل node --experimental-modules node_modules/mocha/bin/_mocha ؟
  • ما مدى مشاركة .jsx بالضبط؟ أرى أن مثال الخطأ الموضح يشير إلى .mjs ؛ من غير الواضح ، مما تم نشره ، حيث يوجد jsx .
  • أتذكر أيضًا بشكل غامض سماع أن التنفيذ الأولي لـ Node يتطلب امتداد الملف .mjs ؛ إذا كان هذا (لا يزال؟) صحيحًا ، وإذا كنت تحاول استخدام import / export مع ملف .jsx (إما import ing a .jsx ملف .mjs أو تحميل ملف .jsx يحتوي على import / export ) ، هل يمكن أن تكون هذه هي المشكلة بدلاً من Mocha؟
  • سنحتاج إلى التوصل إلى طريقة للتأكد من أن التغييرات التي يتم إجراؤها على الميزة التجريبية لا تتطلب تغييرات على Mocha والتي قد تضطر إلى انتظار تخصص semver - وإلا فقد ينتهي بك الأمر في الحال حيث نحن الآن باستثناء الانتظار لفترة أطول (نظرًا لأن دورة الإصدار الرئيسية لـ Mocha ليست مؤمنة مرتين في السنة مثل Node's).
  • بالحديث من وجهة نظري تمامًا وليس نيابة عن الفريق ، إذا كان تنسيق الوحدة الجديدة لا يمكنه التعامل مع تنسيق الوحدة النمطية القديم دون تعديل المكتبات الحالية المكتوبة بالتنسيق القديم ، فإن تنسيق الوحدة الجديدة ليس جاهزًا بعد .

يبدو أنني أتذكر أن الأشخاص Node قد تم تغيير المعيار على وجه التحديد للسماح بالتوافق مع الإصدارات السابقة مع وحدات CommonJS. إذا كان هذا (لا يزال؟) صحيحًا ، فأنا أتوقع أنه سيتم دعمه في النهاية دون الحاجة إلى فعل أي شيء مع / إلى Mocha. (وبعبارة "في النهاية" أعني "ربما تكون أسرع من تغييرات Mocha" ، بالنظر إلى معدل دورة إطلاق Node ؛ انظر التأكيد ، قبل الأخير أدناه للحصول على شرح أكثر تفصيلاً لهذا.)

من خلال بحثي (الصغير) ، يبدو أنه يُسمح على الأقل في الوقت الحالي باستخدام require من وحدة ECMAScript ولكن ليس import من وحدة commonjs.

هل يمكنني أن أفترض أن هذا تم تشغيله مثل عقدة - وحدات تجريبية - وحدات node_modules / mocha / bin / _mocha؟
كيف يتم تضمين .jsx بالضبط؟ أرى أن مثال الخطأ الموضح يشير إلى mjs. من غير الواضح ، مما تم نشره ، حيث توجد jsx.

نعم ، تم تشغيله بـ --experimental-modules . jsx خطأ إملائي ، أعني أن mjs ، سيتم تحديث المنشور الأولي.

أتذكر أيضًا بشكل غامض الاستماع إلى التنفيذ الأولي لـ Node الذي يتطلب تمديد ملف .mjs ؛ إذا كان هذا (لا يزال؟) صحيحًا ، وإذا كنت تحاول استخدام الاستيراد / التصدير مع ملف .jsx (إما استيراد ملف .jsx في ملف .mjs أو تحميل ملف .jsx يحتوي على استيراد / تصدير) ، فهل يمكن ذلك أن تكون القضية وليس المخا؟

يبدو أن المشكلة ، وربما أفتقد شيئًا ما هنا ، أن mocha تستخدم require لتحميل الاختبار (هذا على الأقل افتراضي الحالي لأنني لست خبيرًا في mocha ، أكثر من مستخدم) ثم يتضمن وحدات أخرى عبر import . هذا بالاقتران مع النقطة الأولى من شأنه أن يفسر الخطأ.

سنحتاج إلى التوصل إلى طريقة للتأكد من أن التغييرات التي يتم إجراؤها على الميزة التجريبية لا تتطلب تغييرات على Mocha والتي قد تضطر إلى انتظار تخصص semver - وإلا فقد ينتهي بك الأمر في الحال حيث نحن الآن باستثناء الانتظار لفترة أطول (نظرًا لأن دورة الإصدار الرئيسية لـ Mocha ليست مؤمنة مرتين في السنة مثل Node's).
بالحديث من وجهة نظري تمامًا وليس نيابة عن الفريق ، إذا كان تنسيق الوحدة الجديدة لا يمكنه التعامل مع تنسيق الوحدة النمطية القديم دون تعديل المكتبات الحالية المكتوبة بالتنسيق القديم ، فإن تنسيق الوحدة الجديدة ليس جاهزًا بعد.

كنت أخشى أن يكون هذا هو الجواب وأنا أفهم أن هذه ليست أولوية قصوى. إذا كان افتراضي لسبب الخطأ أعلاه صحيحًا ، فيمكن أن يساعد شيء مثل # 956 حيث يمكن أن تكون نقطة دخول الاختبار عبارة عن وحدة mjs بدلاً من commonjs التي ربما يكون من الصعب تحقيقها بخلاف ذلك. يبدو أنه على خارطة طريق فريق nodejs لدعم import من الوحدات الحالية ، ولكن ليس من الواضح بشأن الجداول الزمنية.

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

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

للتوضيح: بالنظر إلى أنه في البيئات "الأقدم" (في بعض الحالات الحالية غير التجريبية) يعد import خطأ في بناء الجملة ، والذي لا يمكن تجنبه باستخدام المنطق التفريعي أو أي شيء من هذا القبيل ، ما تحتاجه Mocha ليس لتتمكن من استخدام import نفسها ، ولكن بدلاً من ذلك لتتمكن من استخدام require لتحميل الوحدات التي تستخدم (أو التي تستخدم الوحدات التي تستخدم) التنسيق الجديد.

jsx هو خطأ مطبعي ، قصدت أن mjs ، سوف يقوم بتحديث المنشور الأولي.

شكرا ، هذا يلغي زاوية واحدة ممكنة!

إذا كان افتراضي لسبب الخطأ أعلاه صحيحًا ، فيمكن أن يساعد شيء مثل # 956 لأن نقطة دخول الاختبار يمكن أن تكون وحدة mjs بدلاً من commonjs والتي ربما يصعب تحقيقها بخلاف ذلك.

إن جعل Mocha لا ينشئ متغيرات عالمية أمر غير ممكن للأسف بدون إعادة كتابة مكثفة لبعض العناصر الداخلية الأكثر غموضًا (حاولت ولم أتمكن من اكتشافها بنفسي 😿) ؛ ومع ذلك ، فإن استخدام نقطة إدخال JS الخاصة بك أصبح ممكنًا الآن من خلال واجهة برمجة التطبيقات "البرمجية" (والتي قد لا تكون موثقة خارج صفحة wiki القديمة وتعليقات JSDoc في ملفات المصدر ، ولكنها مدعومة رسميًا):

// test.mjs
var Mocha = require('mocha'),
var mocha = new Mocha();

// your mission: create a file `example.mjs`
// in the `test` folder and have it `import` stuff
// as well as using `describe` and `it` to make tests
mocha.addFile("./test/example.mjs");

mocha.run(function(failures){
  process.on('exit', function () {
    process.exit(failures ? 1 : 0);
  });
});
node --experimental-modules test.mjs

لم أحاول فعلاً ذلك لمعرفة ما إذا كان سيحدث فرقًا (أحتاج إلى الحصول على أحدث إصدار من Node أولاً) ، لكن أخبرني إذا كان يعمل من أجلك ...

بادئ ذي بدء ، أشكركم على دعمكم في هذا الأمر!

حاولت هذا

// runner.mjs
import Mocha from 'mocha';
var mocha = new Mocha();

// your mission: create a file `example.mjs`
// in the `test` folder and have it `import` stuff
// as well as using `describe` and `it` to make tests
mocha.addFile('./test/frontend/components/global/test.mjs');

mocha.run(function (failures) {
    process.on('exit', function () {
        process.exit(failures ? 1 : 0);
    });
});

لذلك جعلت نقطة دخول العقدة بشكل أساسي وحدة ECMAScript.

أقوم بتشغيله عبر node --experimental-modules --harmony ./runner.mjs

انا حصلت

(node:88620) ExperimentalWarning: The ESM module loader is experimental.
{ Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /.../test/frontend/components/global/test.mjs
    at Object.Module._extensions..mjs (module.js:658:11)
    at Module.load (module.js:545:32)
    at tryModuleLoad (module.js:508:12)
    at Function.Module._load (module.js:500:3)

ما يحتاجه Mocha ليس أن يكون قادرًا على استخدام import نفسه ، بل أن يكون قادرًا على استخدام يتطلب تحميل الوحدات التي تستخدم (أو تستخدم الوحدات التي تستخدم) التنسيق الجديد.

أخشى أنه غير ممكن حاليًا في العقدة ، يمكنك فقط استخدام require في الوحدات النمطية التي قمت باستيرادها عبر import . هل هناك طريقة لتجنب mocha.addFile('./test/frontend/components/global/test.mjs'); وبدلاً من ذلك قم باستيراد الاختبار وإضافة البرنامج النصي المستورد مثل هذا

import test from './test';
mocha.addTest(test);

؟

لا توجد وظيفة من هذا القبيل في Mocha في الوقت الحالي ، لكن يمكنك القيام بشيء على هذا المنوال. يقوم addFile بإلحاق الملف بقائمة أحدث require d بواسطة الوظيفة run . تستدعي الوظيفة run loadFiles إلى require لهم:

https://github.com/mochajs/mocha/blob/1cc0fc0e6153bbd746b0c2da565363570432cdf7/lib/mocha.js#L220 -L235

ما تريد القيام به هو أي ملفات تحتاج إلى أن تكون import ed بدلاً من require d لا تتصل بـ addFile (لذلك لن تحاول Mocha استخدام require على run ) وبدلاً من ذلك قبل الاتصال بـ run اتصل ببعض الكود الذي يشبه ما هو موجود في loadFiles لكن باستخدام import بدلاً من require . لا أتذكر ما إذا كان هناك أي قيود على استخدام import من شأنه أن يمنع ذلك ، ولكن إذا كان ذلك ممكنًا على الإطلاق ، فأنا أتخيل أنه سيبدو قريبًا جدًا من:

modules.forEach(function (file) {
  file = path.resolve(file);
  mocha.suite.emit('pre-require', global, file, mocha);
  import fileExport from file; // fileExport is used by the exports interface, not sure if anything else; most interfaces act as a side effect of running the file
  mocha.suite.emit('require', fileExport, file, mocha);
  mocha.suite.emit('post-require', global, file, mocha);
});

يمكنك أيضًا إلقاء نظرة على كيفية استخدام https://github.com/mochajs/mocha/blob/master/bin/_mocha واجهة برمجة تطبيقات Mocha البرمجية للتعرف على كيفية توفير خيارات أخرى وكيفية استخدام أشياء مثل وظيفة البحث عن الملفات في Mocha. إنه ليس منظمًا جيدًا ولكن كل ما تفعله واجهة سطر الأوامر موجود هناك (إما بشكل مباشر أو بسبب وجود استدعاء للوظائف في واجهة برمجة التطبيقات البرمجية الخاصة بـ Mocha).

يمكنني التقدم خطوة أخرى ولكن الاختبار المستورد يشكو الآن من أنه لا يعرف شيئًا عن الوصف ( ReferenceError: describe is not defined ). ما هي الطريقة الصحيحة لحقنها؟ إذا فعلت

import Mocha from 'mocha';
const describe = Mocha.describe;

يشتكي من TypeError: describe is not a function

لذا ، حصلت توزيعة أخيرًا على NodeJS 8.5 ، وأتيحت لي الفرصة للعب مع هذا وتأكيد بعض الأحاسيس التي لدي ولكن لم أرغب في ذكرها حتى تمكنت من التحقق:

  1. لا يمكنني العثور على أي طريقة لتحميل وحدة ES بدون تشفير اسمها في ملف نصي / وحدة. هذا يعني أن Mocha لا يمكنه تحميلها من خلال واجهة سطر الأوامر بغض النظر عن ما نقوم به وبغض النظر عن أي ES مقابل دلالات CommonJS. إذا ومتى تغير ذلك ، سنريد أن نعرف ، على ما أعتقد. (إذا تغيرت بحيث يمكن تحميل الوحدة ES من خلال متغير require فربما لن نحتاج إلى تغيير أي شيء ، لكن لا أعتقد أنه يمكننا قول أي شيء عن كيفية عمل الوحدات بالتأكيد حتى يحدث ذلك .)
  2. بينما يقوم Mocha بإعداد الواجهة في انبعاث الحدث pre-require (ليس عند تحميل الوحدة لأول مرة ؛ تكون الواجهة المختارة خاصة بمثيل new Mocha ) ، فإن نظام الوحدة النمطية الجديد يوزع فعليًا شجرة التبعية ويقوم بتحميل التبعيات قبل الوحدات التي تعتمد عليها ، لذا فإن سبب عدم تحديد describe هو أن Mocha لم يعده إلا بعد تحميل وحدات الاختبار. هذا يعني أنه سيكون معقدًا أن يحدث هذا على الإطلاق (مرة أخرى ، ما لم يتم السماح وحتى require(file) وتحميل التبعية في هذا السطر المحدد ، ويفضل أن يكون ذلك بشكل متزامن حتى لا نضطر إلى تغيير أي شيء آخر ).

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

https://gist.github.com/anonymous/caba0883254a2349c5615df8e9286665

node --experimental-modules ./run.mjs

لسوء الحظ ، أنا متأكد تمامًا من أن هذا هو أفضل ما يمكننا فعله بالنظر إلى طريقة عمل الوحدات ES وما تسمح به Node في الوقت الحالي.

فكر في الأمر بطريقة أخرى:

  • import بناء الجملة.
  • require دالة.

لا يمكنك ديناميكيًا import أي شيء ، تمامًا كما لا يمكنك تشغيل التعليمات البرمجية ديناميكيًا دون استخدام ، على سبيل المثال ، eval() .

يوجد اقتراح المرحلة 3 هذا والذي من شأنه أن يسمح بهذا السلوك ، لكنني لست متأكدًا مما إذا كانت هناك أي أوقات تشغيل يتم شحنها حتى الآن.

على هذا النحو ، لا توجد طريقة لـ Mocha لاستيراد ملف .mjs عند التشغيل عبر mocha بدون إضافة ربما @ std / esm واستخدام تنفيذه require للملفات ذات .mjs تمديد قد يكون هذا حلاً قابلاً للتطبيق وشيئًا يمكننا التفكير في دعمه ، ولكن من المحتمل أن تأتي المناقشة (مثل هذه العلاقات العامة) من المجتمع ، على الأقل حتى لا يكون هذا السلوك وراء العلم.

import describe from 'mocha' منخفض جدًا في قائمة الأولويات ، لسوء الحظ ، بسبب الصعوبة المتأصلة حول هذا النوع من الأشياء (# 956). الأفضل أن تعمل بـ node وتلتزم باستهلاك الكرة الأرضية.

في الواقع ، يخطر ببالي أنه يمكننا تحميل الاختبارات والاستفادة من vm.runInContext ، بافتراض أن مثل هذا الشيء يدعم الوحدات النمطية. نظرًا لأن سلوك تحميل Node مرتبط بالامتداد .mjs vm.runInContext سلسلة ، فلا ترى كيف يمكن ذلك - ولا يوجد شيء مذكور حول هذا في المستندات. ربما مشكلة في مكان ما؟

(ثم ​​مرة أخرى ، قد يكون هذا بالضبط ما يفعله @std/esm تحت الغطاء!)

لديّ اختبارات موكا تعمل بدون ناقل في المتصفح . ربما يساعد في هذه القضية.

هذا غير مرتبط لأنك لا تسحب المخاوي كوحدة نمطية ، بل سيناريو ...

آسف الخلط بين نفسي. إنه مختلف في المتصفح.

أرغب في التصويت على الدعم لفعل شيء ما للسماح لـ Mocha بإجراء الاختبارات الموجودة في وحدة ES. لقد هبطت هنا بعد محاولة كتابة مثل هذا الاختبار والحصول على خطأ غريب الأطوار من محمل الوحدة Node.js. أنا أستخدم Node.js 9.5 ، والذي يدعم أصلاً وحدات ES6.

كما هو الحال حاليًا ، لا يسمح Node.js 9.5 لوحدة CommonJS أن تتطلب () وحدة ES6. ربما يعملون في اتجاه السماح بذلك ، لا أعرف.

لقد كتبت الاختبار كوحدة ES6 بامتداد .mjs وحاولت تشغيله. حصلت على الخطأ من المُحمل - أفترض أن الأمر mocha ينتج عنه استخدام require() وهذا هو سبب فشله.

أعد الاختبار باستخدام الامتداد .js وحاول استخدام require() لتحميل الوحدة التي كان من المقرر اختبارها. حصل ذلك أيضًا على الخطأ من المحمل.

أنا من رأيي أن عالم Node.js يحتاج إلى التفكير في كيفية انتقالهم إلى وحدات ES6 ودعمها. نظرًا لأن Mocha هي أداة شائعة جدًا في هذا العالم ، سيكون من الأفضل لفريق Mocha التفكير في كيفية دعم وحدات ES6.

للمتابعة ... بعد بعض التأمل والبحث ، تمكنت من الحصول على هذا التسلسل للعمل كحل بديل.

قم بتسمية البرنامج النصي التجريبي بامتداد .js (مما يجعله نصًا برمجيًا من CommonJS)

ثم أضف هذا في البرنامج النصي للاختبار:

require = require("@std/esm")(module,{"esm":"js"});

ثم يمكنني require() وحدة ES على النحو التالي:

const model = require('../models/notes');

robogeek أو قد يكون من الأفضل استخدام أداة التحميل المسبق @std/esm من سطر الأوامر ، حتى لا تضطر إلى تشويش ملفات المواصفات الخاصة بك بالحلول ، ويمكن أن يكون لديك امتدادات .mjs .

mocha -r @std/esm spec.mjs

يأتي الاستيراد الديناميكي مع العقدة v9.6 خلف العلم --harmony-dynamic-import . تسمح الواردات الديناميكية لـ mocha بتحميل الاختبارات الموجودة في وحدات es6 دون الحاجة إلى ناقل.

harrysarson لن ينجح الأمر خارج الصندوق. يستخدم Mocha وحدات cjs و require ، سيكون عليك كتابة ملفات الاختبار باستخدام cjs ، مع بعض كود الغراء الإضافي للتعامل مع الطبيعة غير المتزامنة لـ import . أم هل فاتني شيء؟

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

لا تزال المشكلة ذات صلة ولكنها تعتمد على الدعم المحلي لـ ESM. المتصفحات لديها ، عقدة ليس بعد.

كنت ألعب للتو ، وأتعرف على ESM / .mjs وقررت أنني بحاجة إلى اختبارات لعبتي. إدراك أن mocha لم يدعم بعد ملفات .mjs رسميًا ، فأنا من خلال وحدة مؤقتة سريعة معًا (حتى يتوفر لدى شخص ما الوقت لإضافة الدعم الكامل إلى mocha):

https://www.npmjs.com/package/mocha-esm
الترحيب بالقضايا / العلاقات العامة: https://github.com/stefanpenner/mocha-esm

قد يكون هناك شيء أفضل هناك ، لكن كان من الممتع القيام به معًا. لذا \ س /

قررت أن أتخلى عن mocha نفسه لدعم الواردات الديناميكية (بناءً على بعض الأفكار المذكورة أعلاه ، لكنني لم أتمكن من تشغيلها بأي طريقة أخرى).

هذا يعني أنه يمكنك الجري باستخدام مثل node --experimental-modules --harmony-dynamic-import test.mjs

ثم في test.mjs :

import 'should';
import Mocha from 'mocha';

const mocha = new Mocha();

mocha.addFile(() => import("./some-module.spec.mjs"));

mocha.run(failures => {
  process.on('exit', function () {
    process.exit(failures ? 1 : 0);
  });
});

احتفظت بالتغييرات في mocha لدعم هذا الحد الأدنى ، ولم يكن لدي الوقت لدمج هذا بشكل صحيح للعلاقات العامة المحتملة ولم أقم بإضافة وحدة npm متخصصة ، ولكن يمكنك تثبيت هذه الشوكة من github مباشرة "mocha": "git+https://[email protected]/odolha/mocha" .

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

تعديل

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

// some-module.psec.mjs
export const test = ({ describe, it }) => {
  describe('Something', () => {
    it('works', () => {
      ...
}

تضمين التغريدة
شكرا لربط الشوكة الخاصة بك.
كان هناك بالفعل علاقات عامة لدعم ESM الأصلي ولكن تم إغلاقه لأن دعم الوحدة لا يزال قيد التجربة.

يريحني تنفيذك من أن إضافة الدعم لهذا يجب أن يكون سهلاً. نحن كثيرون ننتظر بفارغ الصبر هذه الميزة :)

@ demurgos : no_mouth: نعم ... لقد رأيت للتو أن العلاقات العامة بعد أن فعلت الشيء الخاص بي ، d'oh 😃.

تضمين التغريدة
الحزمة esm (المسماة سابقًا @std/esm ) أسقطت ملفات الدعم .mjs في هذا الالتزام .
هذا يعني أنه لم يعد من الممكن استخدامه مع Mocha لاختبار ملفات .mjs . هذا تمت مناقشته في هذه القضية .

ما زلت أريد أن أكون قادرًا على اختبار وحدات ES حتى أتمكن من تشغيلها بأمان في Node أو المتصفحات.

فيما يتعلق بمناقشات الوحدة الحالية ، هناك إجماع على أن .mjs يجب أن يكون متاحًا في النتيجة النهائية (ربما ليس كحل وحيد ، ولكن على الأقل متاح) وأن import("./foo.mjs") سيعيد الوعد لـ مساحة اسم ES المقابلة. إن حقيقة أن وحدات CJS يتم تحويلها إلى وحدة مع تصدير default مقابل module.exports هي أكثر من مناقشة ، ولكن يبدو أنها افتراضات آمنة.

هل من الممكن إعادة النظر في إضافة دعم ES الأصلي باستخدام ديناميكي import إلى Mocha؟ يمكن إعادة تسمية علامة الميزة إلى --experimental-es-modules (من # 3253) للإشارة بشكل أفضل إلى أن هذا يعتمد على التقدم الحالي في دعم Node.
وفقًا للمواعيد النهائية ، لن تصل المواصفات النهائية حتى العقدة 12 ، لذا سيبقى التنفيذ الحالي هناك لبعض الوقت (وهي مجموعة فرعية آمنة نسبيًا من الاقتراح النهائي).

demurgos أنا شخصياً أفضل الانتظار أكثر قليلاً قبل الالتزام بأي تطبيقات رمز على mocha. ولكن ربما يختلفboneskull أو ScottFreeCode ؟

تضمين التغريدة

أسقطت حزمة esm (المعروفة سابقًا باسم @ std / esm) ملفات الدعم .mjs في هذا الالتزام.

محمل esm لم يسقط دعم .mjs . نحن ببساطة نتبع تطبيق --experimental-modules الحالي ونظهر خطأ عند محاولة تحميل .mjs بـ require . لا يزال بإمكان المستخدمين استخدام ملف .js لملف الإدخال التجريبي الخاص بهم الذي يستخدم بنية ESM أو ديناميكي import() لتحميل ملفات الاختبار اللاحقة .mjs أو .js ، كثيرًا مثل esm لاختباراته الخاصة .

وفقًا للمواعيد النهائية ، لن تصل المواصفات النهائية حتى العقدة 12 ، لذا سيبقى التنفيذ الحالي هناك لبعض الوقت

لا يوجد وقت محدد لـ --experimental-modules للهبوط دون تمييز. الأمل هو أنه يمكن أن يهبط في وقت ما في دورة دعم Node 10 _ (لذلك في بعض الوقت في العامين المقبلين) _ ولكن لا يوجد شيء ثابت.

(وهي مجموعة فرعية آمنة نسبيًا من الاقتراح النهائي).

قد لا يكون التنفيذ الحالي لـ --experimental-modules متوافقًا مع الاقتراح النهائي. هناك العديد من المناقشات حول الشكل الذي سيبدو عليه دعم ESM في Node. بعض التوجيهات المقترحة غير متوافقة مع التنفيذ التجريبي الحالي. اعتمادًا على كيفية هز الأشياء ، قد لا يعمل الرمز الذي تكتبه اليوم مقابل --experimental-modules مع أي شكل نهائي.

لم يسقط مُحمل esm دعمه لـ .mjs.

نقطتي هي أن esm لم يعد يمكّنك من طلب .mjs لذلك لم يعد بإمكانك استخدام اكتشاف Mocha التجريبي مقابل .mjs . لكنك على حق ، لم يتم توثيقه ، لذا فهو ليس تغييرًا جذريًا حتى لو اعتمد عليه الآخرون.

فيما يتعلق بالمواعيد النهائية ، كنت أشير إلى هذه المسألة . يبدو أن هناك محاولة لـ Node 11 وتنفيذ نهائي لـ Node 12 بحيث يمكن نقلها إلى Node 10 LTS. البعض يتمنى أن يحدث ذلك عاجلاً ، وحذر آخرون من عدم التسرع في ذلك.

اقتراحي هو دمج # 3253. يوفر هذا فقط آلية الاشتراك لاستخدام import(...) بدلاً من require لتحميل حالات الاختبار. نظرًا لأنني أتوقع أن يتم تطبيقه في الغالب مقابل .mjs في سياق --experimental-modules ، ما زلت أعتقد أنه آمن. (من المرجح أن يظل الاستيراد الديناميكي لـ .mjs مع إعادة وعد بمساحة الاسم). لكنني سأتركك تقرر ما إذا كان بإمكانك دمجها وتجنب الضغط كثيرًا من أجلها.

مرة أخرى ، السبب الرئيسي لهذا العلاقات العامة هو أنه بدونه ، لم يعد بإمكانك استخدام اكتشاف اختبار Mocha ولكن عليك استخدام الحل البديل الموضح أعلاه بواسطةjdalton. (نقطة دخول .js والواردات اليدوية)

اقتراحي هو دمج # 3253.

3253 لديه عدد قليل من العيوب بالتأكيد ليست فكرة جيدة لدمجها كما هي.

باتباع مثال jdalton ، قمت بإعداد سير عمل صغير لاختبار ESM الأصلي بدون حزمة esm (نقي Node + Mocha).
أستخدم تعريفات اختبار غير متزامنة (باستخدام --delay ) و --experimental-modules .

حاليًا ، يمكن لـ _mocha_ استيراد CJS فقط ، ويمكن لـ CJS فقط استيراد ESM باستخدام الوظيفة الزائفة import() الديناميكية. لذلك أقوم بإنشاء نقطة إدخال CJS التالية (ينتهي اسمها بـ .js ) والتي تستورد ملفات المواصفات وتبدأ تنفيذ الاختبار:

test.esm.js :

(async () => {
  await import("./test/a.spec.mjs");
  await import("./test/b.spec.mjs");
  run();
})();

(أقوم بإنشاء نقطة الإدخال بقائمة الواردات في وقت الإنشاء ، ولكن يمكنك كتابتها يدويًا أو استخدام glob هناك.)

ثم أقوم بتنفيذها بالأمر التالي:

NODE_OPTIONS="--experimental-modules" mocha --delay build/test/test.esm.js

لا بد لي من المرور عبر NODE_OPTIONS لأن العلم لا يتعرف عليه المخاوي.


ما زلت آمل أن يقدم المخاوي دعمًا أفضل لـ ESM التجريبية ، ولكن على الأقل من الجيد معرفة أن هناك طريقة لاستخدامه اليوم بدون أدوات أخرى.

@ demurgos هذا حل صغير لطيف وجدته: +1 :.

من الجيد أن نرى أنه من الممكن بالفعل (إن لم يكن من السهل) استخدام وحدات es مع mocha: ابتسامة:.

demurgos تتعلق هذه المشكلة بدعم اختبارات نمط ES6 بدون استخدام ناقل التحويل . ما هو "بناء الوقت"؟ هذا الرمز الذي تستخدمه لإنشاء نقاط دخول الاختبار هو مترجم ، فقط متخصص.

تضمين التغريدة
لقد ذكرت أنني أستخدم أدوات البناء ، لكنها ليست بالمستوى الذي تمت مناقشته في هذه المشكلة: يعمل Mocha مع ESM الأصلي ، وليس ESM الذي تم تخفيضه إلى CJS بواسطة محول.

انظر رسالتي:

أقوم بإنشاء نقطة الإدخال بقائمة عمليات الاستيراد في وقت الإنشاء ، ولكن يمكنك كتابتها يدويًا أو استخدام glob هناك.

لقد استخدمت خطوة إنشاء لأنني أريد أن تكون وارداتي (1) محددة بشكل ثابت و (2) لا تحتفظ بالقائمة بنفسي.

إذا كان لديك عدد قليل فقط من ملفات المواصفات ، فلا بأس من حذف (2): فقط يكون لديك نقطة دخول لاستيراد ملفين من ملفات المواصفات.
(1) يعد بالفعل متطلبًا محددًا لملفات الاختبار ، لذا فهو في الغالب مجرد شيء "من الجيد امتلاكه" ويمكنك استخدام glob في وقت التشغيل (بدلاً من وقت الإنشاء مثلي). هذه مجرد تفاصيل لا تهم في النهاية بمجرد أن تفهم الفكرة الأساسية.

إذا كنت تريد شيئًا مثل حل نسخ ولصق بسيط للعثور على ملفات مواصفات mjs في وقت التشغيل ، فإليك مثال:

const {sync: globSync} = require("glob");

(async () => {
  const matches = globSync("**/*.spec.mjs");
  for (const match of matches) {
    await import(match);
  }
  run();
})();

قم بتشغيله بـ NODE_OPTIONS="--experimental-modules" mocha --delay test.esm.js .
كما ترى ، لا يوجد بناء على الإطلاق ، ولكن هناك ضوضاء أكثر قليلاً في الكود.

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

هذه المشكلة لا تزال سارية ولا ينبغي إغلاقها.

سيحتوي الإصدار القادم من mocha@6 على علامة --experimental-modules المدرجة في القائمة البيضاء مما يسمح بتجربة وحدات ES6 بسهولة أكبر. هل سيكون من الممكن الحصول على إصدار ثانوي أو إصدار تصحيح قبل الإصدار السادس؟ أقوم حاليًا بوضع اللمسات الأخيرة على أداة تغطية جديدة تستخدم مصحح أخطاء V8 بدلاً من Istanbul وأرغب في اختبارها باستخدام وحدتي Mocha و ES6 (دون الحاجة إلى استخدام تبعية git في الحزمة الخاصة بي. json).

تضمين التغريدة

عندما أحاول مثل هذا ...

const {sync: globSync} = require("glob");
(async () => {
    const matches = globSync("**/*.spec.mjs");
    for (const match of matches) {
        await import(match);
    }
    run();
})();

انا حصلت

(node:4632) UnhandledPromiseRejectionWarning: Error: Cannot find module test/Sanity.spec.mjs

لكن عندما أركض هكذا ...

const {sync: globSync} = require("glob");
(async () => {
    await import("./Sanity.spec.mjs");
    run();
})();

إنه يعمل بشكل مثالي ما الذي أفتقده؟

demurgos يجب عليك التنسيق معbcoe ؛ راجع https://github.com/bcoe/c8

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

fwiw أوصي بـ esm فوق --experimental-modules حتى تصبح قصة Node.js صحيحة. سيكون ذلك انتظارًا طويلاً.

تضمين التغريدة
هههه شكرا. أنا أعمل بالفعل حول c8 منذ يوليو (فتحت مجموعة من العلاقات العامة والمشكلات في هذا الريبو). هناك أيضًا بعض قرارات التصميم التي لا نتفق عليها ، لذا نحاول مشاركة معظم التبعيات (كتبت خوارزمية الدمج على سبيل المثال) وقررت أن أنشر أداة أخرى: c88 . لقد حصلت عليه للعمل نهاية هذا الأسبوع وأنا الآن أختبره في مكتباتي. أنا قادر على استخدامه مع ESM الأصلي و mocha في CI. ما زلت بحاجة إلى بعض الوقت لتوثيقه وإصلاحه ولكن من المفترض أن يكون جاهزًا في يناير).

تضمين التغريدة
لقد كتبت الكود أعلى رأسي. يبدو أن المشكلة هنا هي أن globSync يقوم بإرجاع مسارات نسبية لا تبدأ بـ ./ أو ../ . قد ترغب في إلحاقه بـ ./ : يجب أن يعمل مع المسارات النسبية البسيطة.
يجب أن تلاحظ أيضًا أن الواردات الديناميكية تستخدم عناوين URL النسبية: # ، ? وأحرف خاصة أخرى يمكن التعامل معها بشكل مختلف. إذا كنت تريد حلاً صلبًا ، فيجب عليك حل المسار المطلق للوحدة النمطية ثم تحويله إلى عنوان URL لملف. كجزء من عملي على التغطية ، كتبت lib للتحويل بين المسارات المطلقة وعناوين URL: قد ترغب في استخدام fromSysPath من furi . يجب أن تتعامل التحويلات مع أي نوع من المسارات (حتى مساحات أسماء Windows ومسارات UNC ...).

إليك ما قد يبدو عليه المثال الكامل:

const {fromSysPath} = require("furi");
const {sync: globSync} = require("glob");
const {resolve} = require("path");

(async () => {
    const matches = globSync("**/*.spec.mjs");
    for (const match of matches) {
        await import(fromSysPath(resolve(match)).href);
    }
    run();
})();

أعني ، ألا يعمل mocha --require esm فقط ؟ هل نحتاج حقًا إلى الكشف التلقائي؟ هذا يبدو صعبًا ويضيف عبئًا ...

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

شكرا على الاقتراح. لا يزال من الممكن الحصول على --experimental-modules مع NODE_OPTIONS لذا فهي ليست أولوية عالية (وقد يؤدي ذلك إلى تعقيد شجرة git لالتزامات اختيار الكرز). إذا تمكنت من إغلاق المشكلات التي لدي مع التبعيات الأخرى ، فسأرى ما إذا كان بإمكاني قضاء بعض الوقت في هذا الأمر. في غضون ذلك ، أراقب فقط الإصدار السادس.

fwiw أوصي بـ esm على --experimental-modules حتى تصبح قصة Node.js صحيحة. سيكون ذلك انتظارًا طويلاً.
أعني ، ألا يعمل الموكا - يتطلب esm فقط؟

أوافق بالتأكيد على أنه الحل الأفضل في الوقت الحالي: إنه الحل الأسهل للإعداد وقد توقف لبعض الوقت: إنه يعمل. في حالتي ، أحتفظ بأدوات البناء الخاصة بي وأتعامل مع ESM الأصلي كبديل لإصدارات CJS الكلاسيكية. على الرغم من حرصنا الشديد على استخدام ESM الأصلي ، ما زلت أوصي بعدم استخدامه باعتباره الطريقة الوحيدة لتشغيل الكود الخاص بك: فهو تجريبي بعد كل شيء: stuck_out_ tongue : .

تدور معظم رسائلي الأخيرة حول مشاركة ما يمكن فعله باستخدام ESM الأصلي. هذا عمل تجريبي في الغالب وأتوقع أن أضطر إلى تغييره عندما تصبح Node's ESM مستقرة. على المدى الطويل ، هناك فوائد للحصول على حل لا يتطلب حزمة esm . هذه هي أسبابي:

  • يقلل من كمية الأدوات المطلوبة (تعقيد أقل ، تكوين أقل للفهم)
  • قد تكون هناك بعض الاختلافات بين ESM الحقيقي و esm حول حالات الحافة (أخطاء التقييم ، الدورات ، أخطاء التحميل ، الوحدات النمطية غير المتزامنة / الديناميكية ، الوسيط ، إلخ). عند كتابة رمز متماثل ، قد يكون من الأكثر أمانًا تقليل أي مصدر محتمل لتباعد السلوك. يرتبط هذا أيضًا نوعًا ما بالتغطية المحلية: مع esm ، يرى V8 الإخراج المترجم لذا عليك التعامل مع خرائط المصدر (لم يتم دعمها حتى الآن بواسطة c8 ، لكنني أقوم بإعداد PR ، يعملون على c88 ). قد تظهر اختلافات أخرى أيضًا عند تصحيح الأخطاء.
  • إنه يتجنب الاضطرار إلى تحويل الشفرة ديناميكيًا ويساعد في تحسين الأداء.

هل نحتاج حقًا إلى الكشف التلقائي؟ هذا يبدو صعبًا ويضيف عبئًا ...

لست متأكدًا من الكشف التلقائي الذي تشير إليه. هل هو متعلق بالعلاقات العامة التي تم إرسالها في وقت سابق من هذا العام؟


تحرير : أنا أيضًا على Slack لأدوات Node (نشط في الغالب على قناة #c8 ) إذا كنت تريد المناقشة.

demurgos أعتقد أنني كنت في حيرة من أمري حول ما يريده الناس هنا. على أي حال...

إذا كان NODE_OPTIONS=--experimental-modules يعمل حتى يتم دعم --experimental-modules في Mocha v6.0.0 ، فهل هناك أي عمل آخر يجب القيام به لهذه المشكلة؟ هذا ما أفتقده.

أتوقع أن تظل هذه المشكلة مفتوحة حتى تعمل ESM الأصلية ("اختبارات نمط ES6 بدون استخدام ناقل التحويل") خارج الصندوق / بسهولة مثل عمل CJS حاليًا.

الحل الذي نشرته بـ --delay و NODE_OPTIONS=--experimental-modules هو حل بديل أكثر من الدعم المناسب. كنت أعتبر أن هذه المشكلة قد تم إصلاحها بمجرد أن تتمكن من تشغيل mocha **/*.spec.mjs والحصول على تقرير.

لسوء الحظ ، في الوقت الحالي أشعر أنه لا يزال يتعين علينا انتظار Node لمعرفة دعم ESM. يجب أن أتحقق من ذلك ، لكنني أعتقد أن العلاقات العامة لم تستخدم الاكتشاف التلقائي ولكن ببساطة استوردت كل وحدة (CJS أو ESM) باستخدام عمليات الاستيراد الديناميكية. سيعتمد التنفيذ على قصة التشغيل المتداخل للوحدات النمطية.


تحرير : أشير إلى https://github.com/mochajs/mocha/pull/3253. يسمح بتحميل جميع الوحدات النمطية مثل ESM (بدون اكتشاف تلقائي).

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

يجب أن تتضمن العقدة 12 تطبيق ESM الجديد. ستكون مناسبة للتحقق من كيفية دعم وحدات ES في Mocha.

لقد أصبت بخلل GC عند استخدام Mocha و ESM ، ولكن تم الإبلاغ عنه وتأكيده لذا يجب إصلاحه: https://github.com/nodejs/node/issues/27492.

بجانب هذا الخطأ ، لا تزال الاستراتيجية الموضحة في تعليقي أعلاه تعمل على استخدام Mocha مع ESM.

مرحبًا يا شعب موكا ، شكرًا لك على إنشاء أداة لطيفة وصيانتها!

هذا مجرد تعليق لمعلوماتك. خلال الأشهر القليلة الماضية ، كنت أعمل على Mocha و * -test.mjs ، باستخدام التصحيحات كما هو موضح أدناه. لا توجد مشكلة تقريبًا في تشغيل mocha test/*.mjs (بدون محول أو وحدة esm npm).
https://gist.github.com/tadd/756d21bad38933c179f10e59bddee6b4

بالطبع هذا التصحيح ليس "جاهزًا للإنتاج" لمستخدمي المخاوي ؛ هذا مجرد اختراق لمستخدمي Mocha الذين يرغبون في استخدام ESM في أكواد الاختبار في أسرع وقت ممكن.
لقد استخدمت Node.js v11 مع خيار --experimental-modules . حاليًا أنا مع الإصدار 12 ويعمل أيضًا.

إنها قصة أخرى ، لكن Node v12 قدم امتداد .cjs "type" وحقل $ # $ 5 $ # $ في package.json . يبدو أن هذه أيضا بحاجة إلى النظر فيها.

مرحبًا يا شعب موكا ، شكرًا لك على إنشاء أداة لطيفة وصيانتها!

وبالفعل اود ان اشكر 😄

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

https://gist.github.com/maxnordlund/a860dd67013beaf0f31ce776536f0a47

أهلا! هذا ضروري أيضًا لاختبار أي رمز يعتمد على مشروع ES6 الأصلي ، على سبيل المثال العنصر المضاء . خلاف ذلك ، فإنه يرمي مثل هذا:

node_modules/lit-element/lit-element.js:14
import { TemplateResult } from 'lit-html';
       ^

SyntaxError: Unexpected token {
    at Module._compile (internal/modules/cjs/loader.js:703:23)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:770:10)
    at Module.load (internal/modules/cjs/loader.js:628:32)
    at Function.Module._load (internal/modules/cjs/loader.js:555:12)
    at Module.require (internal/modules/cjs/loader.js:666:19)
    at require (internal/modules/cjs/helpers.js:16:16)
    ...

لا أعرف ما إذا كان هناك حل بديل لذلك ، لكنني حاليًا لا أعتقد أن هناك طريقة لاستخدام Mocha مع إطار عمل ES6 الأصلي.

heruan لقد نشرت حلاً يعمل منذ Node 8 في التعليقات أعلاه. فيما يلي إصدار محدث يتطلب العقدة 10.12 لتحويلات عنوان URL للملف الأصلي:

أضف الملف التالي test.esm.js :

const {pathToFileURL} = require("url");
const {sync: globSync} = require("glob");
const {resolve} = require("path");

(async () => {
    const matches = globSync("**/*.spec.mjs"); // Change the glob to match your test files
    for (const match of matches) {
        await import(pathToFileURL(resolve(match)).href);
    }
    run();
})();

ثم قم بإجراء الاختبارات باستخدام mocha --experimental-modules --delay test.esm.js .

يعمل هذا الرمز باستخدام test.esm.js كجسر commonjs لتحميل اختبارات ESM.

تحتوي العقدة 12 على مشكلة تم الإبلاغ عنها حيث يتم جمع IIAFE بواسطة GC (nodejs / node # 27492) ، يجب إصلاحها في أحد الإصدارات الثانوية التالية (قد تكون هناك بعض الحلول ولكني لم أبحث فيها بعد). أوصي باستخدام أحدث إصدار من Node 10 حتى يتم إصلاحه.

سيقوم Thar بتشغيل تحذير UnhandledPromiseRejectionWarning إذا كان هناك أي خطأ. من الأفضل ربط console.error أو معالجة الخطأ بطريقة أخرى.

import glob from "glob"
import { pathToFileURL } from "url"
import { resolve } from "path"
import { promisify } from "util"

const globAsync = promisify(glob)

async function main() {
  const matches = await glob("test/**/*.mjs")

  for (const match of matches) {
    await import(pathToFileURL(resolve(match)).href)
  }

  run()
}

main().catch(console.error)

_ أعلم أن هذا يستخدم import أكثر من require ، لكن انظر إلى موضوعي للحصول على حل يتيح لك البقاء في ESM land_

demurgos شكرًا على مقتطف الشفرة الخاص بالعقدة 10.12 الذي نشرته منذ عشرة أيام!

أنا أقوم بتشغيل Node 12.1 ويبدو أنه يعمل بشكل جيد. هل سيتم إضافة هذا قريبًا إلى Mocha ، أم أن هناك طريقة أسهل للقيام بذلك باستخدام Node 12؟ أيضًا ، كيف يمكنني استخدام هذا في الوضع --watch ؟

يبدو أن https://github.com/standard-things/esm يعمل خارج الصندوق مع --require esm ، لكن سيكون من الرائع التخلص من تبعية أخرى :) شكرًا.

إذا كان على Mocha التبديل إلى ESM في المصدر ، فيمكن أن يوفر Rollup ملف توزيع ESM بالإضافة إلى ملفات CommonJS و / أو UMD.

ميزة أخرى هنا هي أن متصفح HTML لن يحتاج إلى أن يكون ملوثًا بعلامات نصية إضافية لسحب Mocha. يمكن لملفات الاختبار (أو ملف مدخل الاختبار الرئيسي) القيام بالاستيراد (وتجنب "السحر" داخل ملفات الاختبار بقدر ما يتعلق الأمر بمعرفة مصدر المتغيرات - تحتاج فقط إلى تتبع مسارات الاستيراد).

يمكن للمرء استخدام ملحقات CSS لـ Rollup أيضًا للسماح بحقن mocha.css ، مما يقلل الحاجة إلى فوضى HTML.

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

أعتقد أن هذا لا يزال ذا صلة.

هل كان أي شخص قادرًا على تشغيل Mocha مع ES6 Modules على (تحرير: ~ Travis ~) Node> = 12.11.0؟
في 12.10.0 على ما يبدو ، قمت بإعداده بنجاح:
mocha-run.js

(async () => {
    await import("./tests.js");
    run();
})();

ثم يعمل mocha --experimental-modules --delay ./mocha-run.js مثل السحر.

ولكن لسبب غير معروف ، في 12.11.0 ، يتصرف كما لو أنه لن يكون هناك معلمة --delay :

>  mocha --experimental-modules --delay ./mocha-run.js

(node:6439) ExperimentalWarning: The ESM module loader is experimental.

internal/modules/cjs/loader.js:1007

      internalBinding('errors').triggerUncaughtException(

                                ^

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /home/travis/build/Palindrom/Palindrom/mocha-run.js

tomalec أقوم بتشغيل mocha مع وحدات ES على العقدة 12.11.1:

__mocha-run.js__

(async () => {
    await import("./tests.mjs");
    run();
})();

ومع ذلك ، لا يعمل وضع الساعة. ينتظر mocha تغييرات الملف ، لكنه لا يقوم بتشغيل اختباري آخر بعد تغيير الملف.

@ vanslly لاكي لك ؛)
بالنسبة لي مع Node 12.12.0 (https://travis-ci.org/Palindrom/Palindrom/builds/597771311#L450) و mocha-run.js كما اقترحت أعلاه (https://github.com/Palindrom/ Palindrom / الالتزام / 49835962bdd61c849f115e271bbc6c3f82d30511 # diff-24eabf03aee8844b2b4747aa95a6af7d) ،

mocha --experimental-modules --delay test/mocha-run.js https://travis-ci.org/Palindrom/Palindrom/builds/597771311#L643 ، ، لا يزال يطرح نفس الخطأ

أن هذه لا تزال قضية جنونية! لم تعد ESM مخفية بعيدًا عن - الوحدات التجريبية. هذا هو المستقبل.

يخطئ ، في الواقع تم الإعلان عنه قبل يومين ...

بعد فوات الأوان - تحولنا جميعًا إلى Jest.

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

luijar هذا قيد العمل في # 4038

نشرنا أمس إصدارًا تجريبيًا v7.0.0-esm1 : انظر ملاحظات الإصدار .

هذا شيء عظيم أن نرى!

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

تضمين التغريدة
لا يؤثر NodeJs ESM على متصفح Mocha بأي شكل من الأشكال. الاختبارات التي تجريها في متصفحك لا يتم تحميلها بواسطة NodeJs ، عليك القيام بذلك بنفسك في كود HTML الخاص بك.

إذا كنت أتذكر جيدًا ، فيجب عليك تعيين علامة <script> إلى السمة type="module" . لكل من ملفات الاختبار الخاصة بك ولبرنامج Mocha النصي ، من أجل الحفاظ على تسلسل التحميل. كان من المفترض أن تعمل ESM مع المتصفح لسنوات.

juergba : نعم ، بالتأكيد ، ولكن يحتاج المرء إلى ملف توزيع تصدير ESM حتى يتمكن المرء من استخدام مثل import mocha from '../node_modules/mocha/mocha-esm.js'; بدون تجميع - ولأولئك الذين يستخدمون التجميع (على سبيل المثال ، حتى يتمكنوا من استخدام import mocha from 'mocha'; فقط module في package.json حتى يتمكن المجمّعون من اكتشاف بنية ESM تلقائيًا.

موكا مكتوبة في Commonjs ؛ لا يمكننا وضع حقل "وحدة نمطية" في package.json. ستدعم Mocha تشغيل الاختبارات في العقدة المكتوبة في ESM.

إذا لم تكن ترغب في إعادة البناء لاستخدام ESM داخليًا ، فلا يزال بإمكانك استخدام Rollup مع المكون الإضافي CommonJS الخاص به والإشارة إلى ملف ESM الهدف لدعم module (مثل عروض Sinon ومعظم حزم ملاحظة لقد صادفت ، jQuery هو الاستثناء الوحيد الملحوظ الآخر وقد تم إعادة هيكلة المباني لاستخدام ESM).

لقد أنشأت مشروعًا نموذجيًا لاختبار المخاوي باستخدام ESM. يمكنني إجراء الاختبارات بنجاح ، لكني لم أستطع (_yet_) تشغيل التغطية مع مدينة نيويورك / اسطنبول. مساعدتك ستكون موضع ترحيب.

concatime حتى يصبح nyc متوافقًا ، يمكنك استخدام c8 : https://www.npmjs.com/package/c8

c8 --all --include=lib/**/*.js --reporter=lcovonly node_modules/.bin/mocha --recursive

cedx لقد قمت بتحديث نموذج الريبو الخاص بي ، وهو يعمل. مرتب!

قمنا بتطبيق دعم ESM الأصلي الخاص بـ Node في Mocha v7.1.0.

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