Mocha



mocha

mocha

التركيب

التثبيت باستخدام npm على مستوى العالم:

$ npm install --global mocha

أو كإعتماد على التطوير لمشروعك:

$ npm install --save-dev mocha

لتثبيت Mocha v3.0.0 أو الأحدث باستخدام npm ، ستحتاج إلى npm v2.14.2 أو الأحدث. بالإضافة إلى ذلك ، لتشغيل Mocha ، ستحتاج Node.js v4 أو الأحدث.

يمكن أيضًا تثبيت Mocha عبر Bower ( bower install mocha ) ، ويتوفر على cdnjs .

ابدء

$ npm install mocha
$ mkdir test
$ $EDITOR test/test.js # or open with your favorite editor

في المحرر الخاص بك:

var assert = require('assert');
describe('Array', function() {
  describe('#indexOf()', function() {
    it('should return -1 when the value is not present', function() {
      assert.equal([1,2,3].indexOf(4), -1);
    });
  });
});

العودة في المحطة:

$ ./node_modules/mocha/bin/mocha

  Array
    #indexOf()
      ✓ should return -1 when the value is not present


  1 passing (9ms)

قم بإعداد نص برمجي اختبار في package.json:

"scripts": {
    "test": "mocha"
  }

ثم قم بإجراء الاختبارات مع:

$ npm test

يكتشف المكالمات المتعددة التي تم done()

إذا استخدمت اختبارات async المستندة إلى رد الاتصال ، فسيقوم Mocha بإلقاء خطأ إذا تم استدعاء done() عدة مرات. هذا هو مفيد لاصطياد الاستدعاءات المزدوجة العرضية.

it('double done', function(done) {
  // Calling `done()` twice is an error
  setImmediate(done);
  setImmediate(done);
});

تشغيل الاختبار أعلاه سوف يعطيك رسالة الخطأ أدناه:

$ ./node_modules/.bin/mocha mocha.test.js


  ✓ double done
  1) double done

  1 passing (6ms)
  1 failing

  1) double done:
     Error: done() called multiple times
      at Object.<anonymous> (mocha.test.js:1:63)
      at require (internal/module.js:11:18)
      at Array.forEach (<anonymous>)
      at startup (bootstrap_node.js:187:16)
      at bootstrap_node.js:608:3

تأكيدات

يسمح لك Mocha باستخدام أي مكتبة تأكيد تريدها. في المثال أعلاه ، نحن نستخدم وحدة assert مضمنة في Node.js ، ولكن بشكل عام ، إذا ألقت رسالة Error ، فستعمل! هذا يعني أنه يمكنك استخدام المكتبات مثل:

  • should.js - نمط BDD الموضح في جميع المستندات
  • expect() - expect() تأكيدات النمط
  • chai - expect() ، assert() وتأكيدات على مستوى الأسلوب
  • better-assert ذاتي للتوثيق من النمط C assert()
  • غير متوقع - "مجموعة أدوات تأكيد BDD القابلة للتوسعة"

رمز غير متزامن

اختبار كود غير متزامن مع Mocha لا يمكن أن يكون أبسط! ببساطة استدعاء معاودة الاتصال عند اكتمال الاختبار. من خلال إضافة رد اتصال (عادة ما done تسميته بـ) it() ، سيعرف موكا أنه يجب الانتظار حتى يتم استدعاء هذه الوظيفة لإكمال الاختبار. رد الاتصال هذا يقبل كل مثيل Error (أو فئة فرعية منه) أو قيمة كاذبة؛ أي شيء آخر سوف يسبب اختبارًا فاشلًا.

describe('User', function() {
  describe('#save()', function() {
    it('should save without error', function(done) {
      var user = new User('Luna');
      user.save(function(err) {
        if (err) done(err);
        else done();
      });
    });
  });
});

ولتسهيل الأمور ، تقبل وظيفة الاستعادة done() أيضًا مثيل Error (على سبيل المثال ، new Error() ) ، لذا قد نستخدم هذا مباشرةً:

describe('User', function() {
  describe('#save()', function() {
    it('should save without error', function(done) {
      var user = new User('Luna');
      user.save(done);
    });
  });
});

العمل مع الوعود

بدلاً من استخدام رد الاتصال done() ، يمكنك إرجاع Promise . يكون هذا مفيدًا إذا كانت واجهات برمجة التطبيقات التي تختبرها تعد بالعودة بدلاً من أخذ عمليات رد الاتصال:

beforeEach(function() {
  return db.clear()
    .then(function() {
      return db.save([tobi, loki, jane]);
    });
});

describe('#find()', function() {
  it('respond with matching records', function() {
    return db.find({ type: 'User' }).should.eventually.have.length(3);
  });
});

يستخدم المثال الأخير تشاي كما وعدت لتأكيدات واعدة بطلاقة.

في Mocha v3.0.0 والإصدارات الأحدث ، سيؤدي إرجاع " Promise و "تم المكالمة" done() إلى استثناء ، لأن هذا خطأ بوجه عام:

const assert = require('assert');

it('should complete this test', function (done) {
  return new Promise(function (resolve) {
    assert.ok(true);
    resolve();
  })
    .then(done);
});

سيفشل الاختبار أعلاه مع Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both. Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both. . في الإصدارات الأقدم من v3.0.0 ، يتم تجاهل استدعاء to done() بشكل فعال.

باستخدام async / في انتظار

إذا كانت بيئة JS الخاصة بك تدعم التزامن / الانتظار ، فيمكنك أيضًا كتابة اختبارات غير متزامنة كما يلي:

beforeEach(async function() {
  await db.clear();
  await db.save([tobi, loki, jane]);
});

describe('#find()', function() {
  it('responds with matching records', async function() {
    const users = await db.find({ type: 'User' });
    users.should.have.length(3);
  });
});

رمز متزامن

عند اختبار التعليمة البرمجية المتزامنة ، قم بحذف الاستدعاء وسيتابع Mocha تلقائيًا إلى الاختبار التالي.

describe('Array', function() {
  describe('#indexOf()', function() {
    it('should return -1 when the value is not present', function() {
      [1,2,3].indexOf(5).should.equal(-1);
      [1,2,3].indexOf(0).should.equal(-1);
    });
  });
});

وظائف السهم

لا يشجع على تمرير وظائف السهم ("lambdas") إلى Mocha. تربط Lambdas this ولا تستطيع الوصول إلى سياق Mocha. على سبيل المثال ، ستفشل التعليمة البرمجية التالية:

describe('my suite', () => {
  it('my test', () => {
    // should set the timeout of this test to 1000 ms; instead will fail
    this.timeout(1000);
    assert.ok(true);
  });
});

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

السنانير

باستخدام واجهة نمط "BDD" الافتراضية ، يوفر Mocha الخطافات before() ، after() ، و beforeEach() ، و afterEach() . وينبغي استخدام هذه لإعداد شروط مسبقة وتنظيف بعد الاختبارات الخاصة بك.

describe('hooks', function() {

  before(function() {
    // runs before all tests in this block
  });

  after(function() {
    // runs after all tests in this block
  });

  beforeEach(function() {
    // runs before each test in this block
  });

  afterEach(function() {
    // runs after each test in this block
  });

  // test cases
});

يمكن أن تظهر الاختبارات قبل ، أو بعد ، أو تتخللها خطافاتك. يتم تشغيل الخطاف حسب الترتيب المحدد لها ، حسب الاقتضاء ؛ كل من before() خطاطيف تشغيل (مرة واحدة) ، ثم أي خطاطيف beforeEach() ، الاختبارات ، أي خطاطيف afterEach() ، وأخيراً after() hooks (مرة واحدة).

وصف خطاف

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

beforeEach(function() {
  // beforeEach hook
});

beforeEach(function namedFun() {
  // beforeEach:namedFun
});

beforeEach('some description', function() {
  // beforeEach:some description
});

خطاف متزامن

جميع الخطافات ( before() ، after() ، beforeEach() ، قد تكون متزامنة بعد كل afterEach() ) أو متزامن أيضا ، تتصرف مثل حالة اختبار العادية. على سبيل المثال ، قد ترغب في ملء قاعدة البيانات بالمحتوى الوهمي قبل كل اختبار:

describe('Connection', function() {
  var db = new Connection,
    tobi = new User('tobi'),
    loki = new User('loki'),
    jane = new User('jane');

  beforeEach(function(done) {
    db.clear(function(err) {
      if (err) return done(err);
      db.save([tobi, loki, jane], done);
    });
  });

  describe('#find()', function() {
    it('respond with matching records', function(done) {
      db.find({type: 'User'}, function(err, res) {
        if (err) return done(err);
        res.should.have.length(3);
        done();
      });
    });
  });
});

خطاف على مستوى الجذر

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

beforeEach(function() {
  console.log('before every test in every file');
});

تأخر جناح الجذر

إذا كنت بحاجة إلى تنفيذ عمليات غير متزامنة قبل تشغيل أي من الأجنحة الخاصة بك ، فيمكنك تأخير مجموعة الجذر. تشغيل mocha مع العلم - --delay . سيؤدي هذا إلى إرفاق وظيفة رد اتصال خاصة ، run() ، إلى السياق العالمي:

setTimeout(function() {
  // do some setup

  describe('my suite', function() {
    // ...
  });

  run();
}, 5000);

في انتظار الاختبارات

"في الانتظار" - في "شخص ما يجب أن يكتب حالات الاختبار هذه في نهاية المطاف" - حالات الاختبار هي ببساطة تلك الحالات التي ليس لها رد:

describe('Array', function() {
  describe('#indexOf()', function() {
    // pending test below
    it('should return -1 when the value is not present');
  });
});

سيتم الإبلاغ عن الاختبارات المعلقة على هذا النحو.

اختبارات حصرية

تتيح لك الميزة الحصرية تشغيل الحزمة المحددة أو حالة الاختبار فقط من خلال إلحاق .only() بالوظيفة. إليك مثال لتنفيذ مجموعة معينة فقط:

describe('Array', function() {
  describe.only('#indexOf()', function() {
    // ...
  });
});

ملاحظة : سيظل تنفيذ جميع الأجنحة المتداخلة.

في ما يلي مثال على تنفيذ حالة اختبار فردية:

describe('Array', function() {
  describe('#indexOf()', function() {
    it.only('should return -1 unless present', function() {
      // ...
    });

    it('should return the index when present', function() {
      // ...
    });
  });
});

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

describe('Array', function() {
  describe('#indexOf()', function() {
    it.only('should return -1 unless present', function() {
      // this test will be run
    });

    it.only('should return the index when present', function() {
      // this test will also be run
    });

    it('should return -1 if called with a non-Array context', function() {
      // this test will not be run
    });
  });
});

يمكنك أيضًا اختيار عدة مجموعات:

describe('Array', function() {
  describe.only('#indexOf()', function() {
    it('should return -1 unless present', function() {
      // this test will be run
    });

    it('should return the index when present', function() {
      // this test will also be run
    });
  });

  describe.only('#concat()', function () {
    it('should return a new Array', function () {
      // this test will also be run
    });
  });

  describe('#slice()', function () {
    it('should return a new Array', function () {
      // this test will not be run
    });
  });
});

لكن الاختبارات ستكون لها الأسبقية :

describe('Array', function() {
  describe.only('#indexOf()', function() {
    it.only('should return -1 unless present', function() {
      // this test will be run
    });

    it('should return the index when present', function() {
      // this test will not be run
    });
  });
});

ملاحظة : سوف يستمر تنفيذ الخطافات ، إن وجدت.

أن تضع في اعتبارها عدم ارتكاب استخدامات من .only() إلى التحكم في الإصدار ، إلا إذا كنت تعني ذلك حقًا!

اختبارات شاملة

هذه الميزة هي معكوس .only() . من خلال إلحاق. .skip() ، قد تخبر Mocha ببساطة تجاهل هذه الأجنحة (ق) واختبار الحالات (ق). سيتم تمييز أي شيء تم تعليقه على أنه pending ، ويتم الإبلاغ عنه بهذه الصفة. في ما يلي مثال على تخطي مجموعة كاملة:

describe('Array', function() {
  describe.skip('#indexOf()', function() {
    // ...
  });
});

أو حالة اختبار محددة:

describe('Array', function() {
  describe('#indexOf()', function() {
    it.skip('should return -1 unless present', function() {
      // this test will not be run
    });

    it('should return the index when present', function() {
      // this test will be run
    });
  });
});

أفضل ممارسة : استخدم .skip() بدلاً من التعليق على الاختبارات.

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

it('should only test in the correct environment', function() {
  if (/* check test environment */) {
    // make assertions
  } else {
    this.skip();
  }
});

سيتم الإبلاغ عن الاختبار المذكور أعلاه على أنه pending . من المهم أيضًا ملاحظة أن استدعاء this.skip() سيؤدي فعليًا إلى إحباط الاختبار.

أفضل ممارسة : لتجنب الارتباك ، لا تنفذ تعليمات إضافية في اختبار أو ربط بعد استدعاء this.skip() .

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

it('should only test in the correct environment', function() {
  if (/* check test environment */) {
    // make assertions
  } else {
    // do nothing
  }
});

لأن هذا الاختبار لا يفعل شيئًا ، فسيتم الإبلاغ عنه على أنه يمر .

أفضل الممارسات : لا تفعل شيئا! يجب أن يجعل الاختبار تأكيدًا أو يستخدم this.skip() .

لتخطي العديد من الاختبارات بهذه الطريقة ، استخدم this.skip() في خطاف "قبل":

before(function() {
  if (/* check test environment */) {
    // setup code
  } else {
    this.skip();
  }
});

قبل Mocha v3.0.0 ، لم يكن هذا this.skip() مدعومًا في اختبارات وخطافات غير متزامنة.

اختبارات إعادة المحاولة

يمكنك اختيار إعادة محاولة الاختبارات الفاشلة حتى عدد معين من المرات. تم تصميم هذه الميزة للتعامل مع الاختبارات من طرف إلى طرف (اختبارات وظيفية / السيلينيوم ...) حيث لا يمكن استهزاء الموارد أو استدعائها بسهولة. لا ينصح باستخدام هذه الميزة لاختبارات الوحدة .

هذه الميزة يتم إعادة تشغيلها before/after خطاف ولكن ليس before/after الخطافات.

ملاحظة : تمت كتابة المثال أدناه باستخدام webdriver السيلينيوم (الذي الكتابة فوق hooks موكا العالمية لسلسلة Promise ).

describe('retries', function() {
  // Retry all tests in this suite up to 4 times
  this.retries(4);

  beforeEach(function () {
    browser.get('http://www.yahoo.com');
  });

  it('should succeed on the 3rd try', function () {
    // Specify this test to only retry up to 2 times
    this.retries(2);
    expect($('.foo').isDisplayed()).to.eventually.be.true;
  });
});

ديناميكي توليد الاختبارات

وبالنظر إلى استخدام Mocha لـ Function.prototype.call وتعبيرات الدالة لتحديد الأجنحة وحالات الاختبار ، فمن السهل إنشاء الاختبارات بشكل ديناميكي. ليست هناك حاجة لبناء جملة خاصة - plain ol "يمكن استخدام جافا سكريبت لتحقيق وظيفة مشابهة للاختبارات" المعلمة "، والتي ربما تكون قد شاهدتها في أطر أخرى.

خذ المثال التالي:

var assert = require('chai').assert;

function add() {
  return Array.prototype.slice.call(arguments).reduce(function(prev, curr) {
    return prev + curr;
  }, 0);
}

describe('add()', function() {
  var tests = [
    {args: [1, 2],       expected: 3},
    {args: [1, 2, 3],    expected: 6},
    {args: [1, 2, 3, 4], expected: 10}
  ];

  tests.forEach(function(test) {
    it('correctly adds ' + test.args.length + ' args', function() {
      var res = add.apply(null, test.args);
      assert.equal(res, test.expected);
    });
  });
});

سينتج الكود السابق مجموعة مع ثلاث مواصفات:

$ mocha

  add()
    ✓ correctly adds 2 args
    ✓ correctly adds 3 args
    ✓ correctly adds 4 args

مدة الاختبار

سيعرض العديد من المراسلين مدة الاختبار ، بالإضافة إلى اختبارات الإبلاغ بطيئة ، كما هو موضح هنا مع مراسل "المواصفات":

مدة الاختبار

لتعديل ما يعتبر "بطيئًا" ، يمكنك استخدام الأسلوب slow() :

describe('something slow', function() {
  this.slow(10000);

  it('should take long enough for me to go make a sandwich', function() {
    // ...
  });
});

مهلة

على مستوى جناح

يمكن تطبيق المهلة على مستوى الجناح على "مجموعات" كاملة للاختبار ، أو تعطيلها عبر هذا. this.timeout(0) . سيتم توريث هذا بواسطة كل الأجنحة المتداخلة وحالات الاختبار التي لا تتخطى القيمة.

describe('a suite of tests', function() {
  this.timeout(500);

  it('should take less than 500ms', function(done){
    setTimeout(done, 300);
  });

  it('should take less than 500ms as well', function(done){
    setTimeout(done, 250);
  });
})

على مستوى الاختبار

قد يتم أيضًا تطبيق المهلات المحددة للاختبار ، أو استخدام هذا. this.timeout(0) لتعطيل المهلات كلها:

it('should take less than 500ms', function(done){
  this.timeout(500);
  setTimeout(done, 300);
});

على مستوى هوك

قد يتم أيضًا تطبيق المهلات على مستوى هوك:

describe('a suite of tests', function() {
  beforeEach(function(done) {
    this.timeout(3000); // A very long environment setup.
    setTimeout(done, 2500);
  });
});

مرة أخرى ، استخدم هذا. this.timeout(0) لتعطيل مهلة ربط.

في v3.0.0 أو الأحدث ، سيتسبب معلمة تم تمريرها إلى هذا this.timeout() أكبر من القيمة القصوى للتأخير في تعطيل المهلة.

بيانات الاختلاف

يدعم Mocha خصائص err.actual و err.actual أي ق اسم AssertionError من مكتبة تأكيد. سيحاول موكا عرض الفرق بين ما كان متوقعًا ، وما رآه بالفعل. إليك مثال على فرق "السلسلة":

سلسلة الخلافات

استعمال

  Usage: mocha [debug] [options] [files]


  Options:

    -V, --version                           output the version number
    -A, --async-only                        force all tests to take a callback (async) or return a promise
    -c, --colors                            force enabling of colors
    -C, --no-colors                         force disabling of colors
    -G, --growl                             enable growl notification support
    -O, --reporter-options <k=v,k2=v2,...>  reporter-specific options
    -R, --reporter <name>                   specify the reporter to use
    -S, --sort                              sort test files
    -b, --bail                              bail after first test failure
    -d, --debug                             enable node's debugger, synonym for node --debug
    -g, --grep <pattern>                    only run tests matching <pattern>
    -f, --fgrep <string>                    only run tests containing <string>
    -gc, --expose-gc                        expose gc extension
    -i, --invert                            inverts --grep and --fgrep matches
    -r, --require <name>                    require the given module
    -s, --slow <ms>                         "slow" test threshold in milliseconds [75]
    -t, --timeout <ms>                      set test-case timeout in milliseconds [2000]
    -u, --ui <name>                         specify user-interface (bdd|tdd|qunit|exports)
    -w, --watch                             watch files for changes
    --check-leaks                           check for global variable leaks
    --full-trace                            display the full stack trace
    --compilers <ext>:<module>,...          use the given module(s) to compile files
    --debug-brk                             enable node's debugger breaking on the first line
    --globals <names>                       allow the given comma-delimited global [names]
    --es_staging                            enable all staged features
    --file <file>                           include a file to be ran during the suite [file]
    --harmony<_classes,_generators,...>     all node --harmony* flags are available
    --preserve-symlinks                     Instructs the module loader to preserve symbolic links when resolving and caching modules
    --icu-data-dir                          include ICU data
    --inline-diffs                          display actual/expected differences inline within each string
    --inspect                               activate devtools in chrome
    --inspect-brk                           activate devtools in chrome and break on the first line
    --interfaces                            display available interfaces
    --no-deprecation                        silence deprecation warnings
    --exit                                  force shutdown of the event loop after test run: mocha will call process.exit
    --no-timeouts                           disables timeouts, given implicitly with --debug
    --no-warnings                           silence all node process warnings
    --opts <path>                           specify opts path
    --perf-basic-prof                       enable perf linux profiler (basic support)
    --napi-modules                          enable experimental NAPI modules
    --prof                                  log statistical profiling information
    --log-timer-events                      Time events including external callbacks
    --recursive                             include sub directories
    --reporters                             display available reporters
    --retries <times>                       set numbers of time to retry a failed test case
    --throw-deprecation                     throw an exception anytime a deprecated function is used
    --trace                                 trace function calls
    --trace-deprecation                     show stack traces on deprecations
    --trace-warnings                        show stack traces on node process warnings
    --use_strict                            enforce strict mode
    --watch-extensions <ext>,...            additional extensions to monitor with --watch
    --delay                                 wait for async suite definition
    --allow-uncaught                        enable uncaught errors to propagate
    --forbid-only                           causes test marked with only to fail the suite
    --forbid-pending                        causes pending tests and test marked with skip to fail the suite
    -h, --help                              output usage information


  Commands:

    init <path>  initialize a client-side mocha setup at <path>

-w, --watch

ينفذ اختبارات حول التغييرات التي تطرأ على JavaScript في CWD ، وبمجرد البدء.

--exit / --no-exit

تحديث في موكا v4.0.0

قبل الإصدار v4.0.0 ، بشكل افتراضي ، سيقوم Mocha بإجبار العملية الخاصة به على الخروج بمجرد الانتهاء من تنفيذ جميع الاختبارات. يمكّن هذا السلوك مجموعة من المشاكل المحتملة؛ إنه مؤشر على الاختبارات (أو التركيبات ، أو الأدوات ، أو الشفرات الخاضعة للاختبار ، إلخ) والتي لا تنظف بعدها بشكل صحيح. في نهاية المطاف ، يمكن أن تؤدي الاختبارات "القذرة" (ولكن ليس دائمًا) إلى نتائج سلبية خاطئة أو إيجابية كاذبة .

يظهر "الشنق" في الغالب نفسه إذا كان الخادم لا يزال يستمع على منفذ ، أو مازال المقبس مفتوحًا ، وما إلى ذلك. كما يمكن أن يكون شيئًا مثل setInterval() ، أو حتى Promise خاطئ لم يتحقق أبدًا.

السلوك الافتراضي في v4.0.0 هو --no-exit ، حيث كان سابقا - --exit .

إن أسهل طريقة "لإصلاح" المشكلة هي ببساطة المرور - --exit عملية Mocha. يمكن أن يستغرق الأمر وقتًا طويلاً في التصحيح - لأنه ليس دائمًا ما يكون واضحًا حيث تكون المشكلة - ولكن يُنصح بذلك.

للتأكد من أن الاختبارات لا تترك بعض الفوضى ، إليك بعض الأفكار للبدء:

--compilers

تحديث في موكا v4.0.0

--compilers تم إيقاف عمل --compilers كما في Mocha v4.0.0. انظر مزيد من الشرح والحلول .

لم يعد تطبيق CoffeeScript مدعومًا من المربع. يمكن استخدام CS و transpilers مشابهة عن طريق تعيين ملحقات الملفات (للاستخدام مع --watch ) واسم الوحدة النمطية. على سبيل المثال - --compilers coffee:coffee-script مع CoffeeScript 1.6 أو - --compilers coffee:coffee-script/register مع CoffeeScript 1.7+.

حول بابل

إذا كانت وحدات ES6 الخاصة بك بها امتداد .js ، يمكنك npm install --save-dev babel-register واستخدام mocha --require babel-register ؛ --compilers ضروري فقط إذا كنت بحاجة إلى تحديد ملحق الملف.

-b, --bail

مهتمة فقط في الاستثناء الأول؟ استخدام --bail !

-d, --debug

تمكين دعم مصحح العقدة ، هذا ينفذ البرنامج النصي الخاص بك (s) مع node debug <file ...> مما يسمح لك بالمرور عبر التعليمات البرمجية وكسرها مع بيان debugger . لاحظ الفرق بين mocha debug و mocha --debug : mocha --debug mocha debug mocha --debug عميل debug mocha --debug ، وسيسمح لك mocha --debug باستخدام واجهة مختلفة - مثل Blink Developer Tools. ضمانات - لم يحن الوقت.

--globals <names>

يقبل قائمة مفصولة بفواصل بأسماء المتغيرات العامة المقبولة. على سبيل المثال ، لنفترض أن تطبيقك --globals app,YUI إلى --globals app,YUI عالمي مسمى و YUI ، قد ترغب في إضافة --globals app,YUI . كما تقبل أحرف البدل. يمكنك أن تفعل - --globals '*bar' وأنها سوف تتناسب مع foobar ، barbar ، إلخ. يمكنك أيضا ببساطة تمرير '*' لتجاهل جميع globals.

باستخدام هذا الخيار بالتزامن مع --check-leaks ، يمكنك تحديد قائمة بيضاء للمتغيرات العالمية المعروفة التي تتوقع أن تتسرب إلى نطاق عالمي.

--check-leaks

استخدم هذا الخيار لإجراء فحص Mocha للمتغيرات العامة التي تم تسريبها أثناء تشغيل الاختبارات. حدد --globals المقبولة عبر خيار --globals (على سبيل المثال: --check-leaks --globals jQuery,MyLib ).

-r, --require <module-name>

إن خيار --require مفيد للمكتبات مثل should.js ، لذا يمكنك ببساطة - --require should عليك --require should بدلاً من --require should يدويًا require('should') داخل كل ملف اختبار. لاحظ أن هذا الأمر يعمل جيدًا لأنه should أن يزيد من Object.prototype ، ومع ذلك إذا كنت ترغب في الوصول إلى صادرات الوحدة ، فيجب عليك أن تطلبها ، على سبيل المثال var should = require('should') . علاوة على ذلك ، يمكن استخدامه مع المسارات النسبية ، على سبيل المثال - --require ./test/helper.js

-u, --ui <name>

يتيح لك الخيار --ui تحديد الواجهة التي تريد استخدامها ، وتغييرها إلى "bdd".

-R, --reporter <name>

يتيح لك الخيار --reporter تحديد المراسل الذي سيتم استخدامه ، مع تعيين "محدد". يمكن استخدام هذه العلامة أيضًا لاستخدام مراسلين تابعين لجهات خارجية. على سبيل المثال ، إذا قمت npm install mocha-lcov-reporter لك أن تفعل --reporter mocha-lcov-reporter .

-t, --timeout <ms>

لتحديد انتهاء مهلة الاختبار ، مع التخلف عن العمل لمدة ثانيتين. لتجاوز قد تجتاز المهلة بالمللي ثانية ، أو قيمة مع اللاحقة s ، ex: - --timeout 2s أو - --timeout 2000 سيكون معادلاً.

--no-timeouts

تعطيل المهلات. أي ما يعادل - في --timeout 0 .

-s, --slow <ms>

حدد عتبة الاختبار "البطيئة" ، التي تتعطل إلى 75 مللي ثانية. يستخدم Mocha ذلك لتسليط الضوء على حالات الاختبار التي تستغرق وقتًا طويلاً.

--file <file>

أضف ملفًا تريد تضمينه أولاً في مجموعة اختبار. يكون ذلك مفيدًا إذا كان لديك بعض رموز الإعداد العامة التي يجب تضمينها في مجموعة الاختبار. لا يتأثر الملف الذي تم تمريره بأية إشارات أخرى (- --recursive أو - --sort ليس له أي تأثير). يقبل العديد من إشارات الملفات لتشمل ملفات متعددة ، والترتيب الذي يتم تعيين العلامات إليه هو الترتيب الذي يتم تضمين الملفات به في مجموعة الاختبار. ويمكن أيضا أن تستخدم في mocha.opts .

-g, --grep <pattern>

--grep الخيار --grep عند التحديد إلى تشغيل mocha لتشغيل فقط الاختبارات المطابقة pattern المحدد الذي يتم --grep داخليًا إلى RegExp .

لنفترض ، على سبيل المثال ، أن لديك اختبارات ذات صلة بـ "api" ، بالإضافة إلى اختبارات ذات صلة بـ "التطبيق" ، كما هو موضح في المقتطف التالي ؛ يمكن للمرء أن يستخدم - --grep api أو --grep app للتشغيل لتشغيل واحد أو آخر. وينطبق نفس الشىء على أي جزء آخر من مجموعة أو حالة اختبار ، --grep users سيكونون صالحين ، أو حتى - --grep GET .

describe('api', function() {
  describe('GET /api/users', function() {
    it('respond with an array of users', function() {
      // ...
    });
  });
});

describe('app', function() {
  describe('GET /users', function() {
    it('respond with an array of users', function() {
      // ...
    });
  });
});

واجهات

يسمح نظام "الواجهة" Mocha للمطورين باختيار أسلوبهم في DSL. يحتوي موكا على واجهات BDD و TDD و Exports و QUnit و STYRESS -style .

BDD

توفر واجهة BDD describe() ، context() ، it() ، specify() ، before() ، after() ، beforeEach() ، و afterEach() .

context() هو مجرد اسم مستعار describe() ، ويتصرف بنفس الطريقة ؛ إنه يوفر طريقة فقط لجعل الاختبارات أسهل في القراءة والتنظيم. وبالمثل ، specify() هو اسم مستعار it() .

تمت كتابة كافة الأمثلة السابقة باستخدام واجهة BDD .

  describe('Array', function() {
    before(function() {
      // ...
    });

    describe('#indexOf()', function() {
      context('when not present', function() {
        it('should not throw an error', function() {
          (function() {
            [1,2,3].indexOf(4);
          }).should.not.throw();
        });
        it('should return -1', function() {
          [1,2,3].indexOf(4).should.equal(-1);
        });
      });
      context('when present', function() {
        it('should return the index where the element first appears in the array', function() {
          [1,2,3].indexOf(3).should.equal(2);
        });
      });
    });
  });

TDD

توفر واجهة TDD suite() test() suiteSetup() و suiteTeardown() و setup() و teardown() :

suite('Array', function() {
  setup(function() {
    // ...
  });

  suite('#indexOf()', function() {
    test('should return -1 when not present', function() {
      assert.equal(-1, [1,2,3].indexOf(4));
    });
  });
});

صادرات

واجهة التصدير تشبه إلى حد كبير Expresso Mocha. المفاتيح before ، after ، beforeEach ، afterEach تكون ذات قيم خاصة ، وقيم الكائنات هي مجموعات ، وقيم الدوال هي حالات اختبار:

module.exports = {
  before: function() {
    // ...
  },

  'Array': {
    '#indexOf()': {
      'should return -1 when not present': function() {
        [1,2,3].indexOf(4).should.equal(-1);
      }
    }
  }
};

QUnit

تتطابق واجهة QUnit -inspired مع المظهر "المسطح" لـ QUnit ، حيث يتم تحديد عنوان مجموعة الاختبار ببساطة قبل حالات الاختبار. مثل TDD ، فإنه يستخدم suite() test() ، ولكن يشبه BDD ، فإنه يحتوي أيضا before() ، after() ، beforeEach() ، وبعد afterEach() .

function ok(expr, msg) {
  if (!expr) throw new Error(msg);
}

suite('Array');

test('#length', function() {
  var arr = [1,2,3];
  ok(arr.length == 3);
});

test('#indexOf()', function() {
  var arr = [1,2,3];
  ok(arr.indexOf(1) == 0);
  ok(arr.indexOf(2) == 1);
  ok(arr.indexOf(3) == 2);
});

suite('String');

test('#length', function() {
  ok('foo'.length == 3);
});

تطلب

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

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

var testCase = require('mocha').describe;
var pre = require('mocha').before;
var assertions = require('mocha').it;
var assert = require('chai').assert;

testCase('Array', function() {
  pre(function() {
    // ...
  });

  testCase('#indexOf()', function() {
    assertions('should return -1 when not present', function() {
      assert.equal([1,2,3].indexOf(4), -1);
    });
  });
});

للصحفيين

يقوم موكا موكا بالتأقلم مع النافذة الطرفية ، ويقوم دائمًا بتعطيل تلوين ANSI-escape عندما لا يتم ربط stdio streams مع TTY.

المواصفات

هذا هو المراسل الافتراضي. يخرج مراسل "المواصفات" عرضًا هرميًا متداخلاً تمامًا مثل حالات الاختبار.

مراسل المواصفاتصحفي المواصفات مع الفشل

تشكيل نقطي

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

مراسل نقطية

نيان

المراسل "نيان" هو بالضبط ما قد تتوقعه:

ش ان نيان القط مراسل

صنبور

ينقل مراسل TAP الخطوط لمستهلك Test-Anything-Protocol .

اختبار أي شيء بروتوكول

المهبط

مراسل الهبوط قطاع ( landing ) هو مراسل اختبار لافت محاكاة طائرة الهبوط :) unicode ftw

هبوط الطائرة مراسل الشريطالهبوط مع الفشل

قائمة

يخرج مراسل "القائمة" قائمة مواصفات بسيطة عندما تمر حالات الاختبار أو تفشل ، وتصدر تفاصيل الفشل في أسفل المخرجات.

قائمة المراسل

تقدم

يطبق مراسل "التقدم" شريط تقدم بسيط:

شريط التقدم

JSON

يخرج المراسل "JSON" كائن JSON كبيرًا واحدًا عند اكتمال الاختبارات (فشل أم لا).

مراسل جسون

JSON Stream

يقوم مراسل "JSON stream" بإخراج "أحداث" JSON المفصلة الجديدة عند حدوثها ، بدءًا من حدث "البدء" ، متبوعًا بتمريرات الاختبار أو الفشل ، ومن ثم حدث "النهاية" النهائي.

json تيار المراسل

دقيقة

يعرض المراسل "min" الملخص فقط ، بينما يستمر في إظهار الأخطاء عند الفشل. يعمل هذا المراسل بشكل رائع مع - --watch حيث يتم مسح الجهاز من أجل الحفاظ على ملخص الاختبار الخاص بك في الأعلى.

دقيقة المراسل

وثيقة

يخرج المراسل "doc" تمثيلًا هرمًا لتسلسل HTML في اختباراتك. لفها برأس وتذييل وبعض التصميم ، ثم لديك بعض الوثائق الرائعة!

وثيقة المراسل

على سبيل المثال ، لنفترض أن لديك جافا سكريبت التالية:

describe('Array', function() {
  describe('#indexOf()', function() {
    it('should return -1 when the value is not present', function() {
      [1,2,3].indexOf(5).should.equal(-1);
      [1,2,3].indexOf(0).should.equal(-1);
    });
  });
});

سوف ينتج عن الأمر mocha --reporter doc array :

<section class="suite">
  <h1>Array</h1>
  <dl>
    <section class="suite">
      <h1>#indexOf()</h1>
      <dl>
      <dt>should return -1 when the value is not present</dt>
      <dd><pre><code>[1,2,3].indexOf(5).should.equal(-1);
[1,2,3].indexOf(0).should.equal(-1);</code></pre></dd>
      </dl>
    </section>
  </dl>
</section>

تم إنشاء وثائق اختبار مكتبة طلب SuperAgent باستخدام مراسل Doc في Mocha باستخدام أمر Bash هذا:

$ mocha --reporter=doc | cat docs/head.html - docs/tail.html > docs/test.html

عرض MakeFile SuperAgent كمرجع.

تخفيض السعر

يولد المراسل "تخفيض السعر" جدولاً للقيمة والهبوط لجدول الاختبار الخاص بك. هذا أمر رائع إذا كنت ترغب في استخدام الاختبارات كمستند ضمن صفحة Wiki Gitub ، أو ملف تخفيض السعر في مستودع التخزين الذي يمكن لـ Github تقديمه. على سبيل المثال هنا هو اختبار الاتصال Connect.

XUnit

مراسل xunit متاح أيضا. إخراج مستند XML XUnit متوافق ، غالباً ما تنطبق في ملقمات CI.

بشكل افتراضي ، سيتم إخراجها إلى وحدة التحكم. للكتابة مباشرة إلى ملف ، استخدم --reporter-options output=filename.xml .

طرف ثالث مراسلون

Mocha يسمح لك بتحديد المراسلين المخصصين. لمزيد من المعلومات ، انظر wiki . مثال على ذلك هو مراسل TeamCity .

مراسل HTML

مراسل HTML غير مخصص للاستخدام على سطر الأوامر.

تشغيل Mocha في المتصفح

يدير Mocha في المتصفح. سيكون لكل إصدار من Mocha ./mocha.js جديدة من ./mocha.js و ./mocha.css للاستخدام في المتصفح.

أساليب خاصة بالمتصفح

تعمل الطريقة (الأساليب) التالية فقط في سياق المستعرض:

mocha.allowUncaught() : إذا تم استدعاؤه ، فلن يتم استيعاب الأخطاء التي لم يتم تجاهلها بواسطة معالج الأخطاء.

قد يبدو الإعداد النموذجي شبيهًا بما يلي ، حيث نسميه mocha.setup('bdd') لاستخدام واجهة BDD قبل تحميل البرامج النصية للاختبار ، وتشغيلها على onload مع mocha.run() .

<html>
<head>
  <meta charset="utf-8">
  <title>Mocha Tests</title>
  <link href="https://cdn.rawgit.com/mochajs/mocha/2.2.5/mocha.css" rel="stylesheet" />
</head>
<body>
  <div id="mocha"></div>

  <script src="https://cdn.rawgit.com/jquery/jquery/2.1.4/dist/jquery.min.js"></script>
  <script src="https://cdn.rawgit.com/Automattic/expect.js/0.3.1/index.js"></script>
  <script src="https://cdn.rawgit.com/mochajs/mocha/2.2.5/mocha.js"></script>

  <script>mocha.setup('bdd')</script>
  <script src="test.array.js"></script>
  <script src="test.object.js"></script>
  <script src="test.xhr.js"></script>
  <script>
    mocha.checkLeaks();
    mocha.globals(['jQuery']);
    mocha.run();
  </script>
</body>
</html>

Grep

The browser may use the --grep as functionality. Append a query-string to your URL: ?grep=api .

Browser Configuration

Mocha options can be set via mocha.setup() . أمثلة:

// Use "tdd" interface.  This is a shortcut to setting the interface;
// any other options must be passed via an object.
mocha.setup('tdd');

// This is equivalent to the above.
mocha.setup({
  ui: 'tdd'
});

// Use "tdd" interface, ignore leaks, and force all tests to be asynchronous
mocha.setup({
  ui: 'tdd',
  ignoreLeaks: true,
  asyncOnly: true
});

Browser-specific Option(s)

The following option(s) only function in a browser context:

noHighlighting : If set to true , do not attempt to use syntax highlighting on output test code.

Reporting

The “HTML” reporter is what you see when running Mocha in the browser. تبدو هكذا:

HTML test reporter

Mochawesome is a great alternative to the default HTML reporter.

mocha.opts

Back on the server, Mocha will attempt to load ./test/mocha.opts as a configuration file of sorts. The lines in this file are combined with any command-line arguments. The command-line arguments take precedence. For example, suppose you have the following mocha.opts file:

  --require should
  --reporter dot
  --ui bdd

This will default the reporter to dot , require the should library, and use bdd as the interface. With this, you may then invoke mocha with additional arguments, here enabling Growl support, and changing the reporter to list :

$ mocha --reporter list --growl

The test/ Directory

By default, mocha looks for the glob ./test/*.js , so you may want to put your tests in test/ folder. If you want to include sub directories, use --recursive , since ./test/*.js only matches files in the first level of test and ./test/**/*.js only matches files in the second level of test .

Editor Plugins

The following editor-related packages are available:

TextMate

The Mocha TextMate bundle includes snippets to make writing tests quicker and more enjoyable.

JetBrains

JetBrains provides a NodeJS plugin for its suite of IDEs (IntelliJ IDEA, WebStorm, etc.), which contains a Mocha test runner, among other things.

JetBrains Mocha Runner Plugin in Action

The plugin is titled NodeJS , and can be installed via Preferences > Plugins , assuming your license allows it.

Wallaby.js

Wallaby.js is a continuous testing tool that enables real-time code coverage for Mocha with any assertion library in VS Code, Atom, JetBrains IDEs (IntelliJ IDEA, WebStorm, etc.), Sublime Text and Visual Studio for both browser and node.js projects.

Wallaby.js in Action

Emacs

Emacs support for running Mocha tests is available via a 3rd party package mocha.el . The package is available on MELPA, and can be installed via Mx package-install mocha .

Emacs Mocha Runner in Action

Mocha Sidebar (VS Code)

Mocha sidebar is the most complete mocha extension for vs code.

الميزات

  • see all tests in VS Code sidebar menu
  • run & debug tests for each level hierarchy from all tests to a single test (and each describe of course)
  • auto run tests on file save
  • see tests results directly in the code editor