Порядок подключения плагинов к ChaiJS

ChaiJS

Согласно документации (ссылка), подключение плагинов к ChaiJS делается так:

var chai = require('chai');
var chaiPlugin1 = require('./helpers/plugin1');
var chaiPlugin2 = require('./helpers/plugin2');
var expect = chai.expect;
 
chai.use(chaiPlugin1);
chai.use(chaiPlugin2);

Все четко, понятно и однозначно. Нет. Что будет в ситуации, когда chaiPlugin1 «оперирует» всем, что есть в chai.assert? То есть, этот плагин дополняет поведение всех assertion’ов. А потом мы подключаем chaiPlugin2. И его поведение уже не будет дополнено. Чаще всего на такие ситуации можно не обращать внимание. Но сегодня мне попался частный случай, где такое поведение начало приводить к ошибкам. Речь пойдет о тикете — Not working with chai-as-promised. Мой плагин (chai-string) «отказался» работать вместе с chai-as-promised. С чего бы это? Суть кроется в исходном коде файла lib/chai-as-promised.js. В самом низу есть фрагмент вида:

var assert = chai.assert;
// ....
var originalAssertMethods = Object.getOwnPropertyNames(assert).filter(function (propName) {
  return typeof assert[propName] === "function";
});
// ....
assert.eventually = {};
originalAssertMethods.forEach(function (assertMethodName) {
  assert.eventually[assertMethodName] = function (promise) {
    // some code
  });
});

В assert добавляется поле eventually, которое является объектом с методами, соответствующими всем доступным на данный момент assertion’ам. Легко понять, что плагины, которые подключаются после chai-as-promised, уже не будут добавлены в assert.eventually. Собственно, из-за этого ошибка и возникла.

Вывод: подключать chai-as-promised последним и проверять другие плагины на похожее «жадное» поведение.

, ,

Оставить комментарий

Top ↑ | Main page | Back