chai предоставляет метод use
для доступа к экспорту chai
, и это utils
.
Этот метод может использоваться третьими сторонами при создании подключаемых модулей, но он также используется внутри для загрузки интерфейса.
Реализация этого метода проста:
exports.use = function (fn) {
if (!~used.indexOf(fn)) {
fn(this, util);
used.push(fn);
}
return this;
};
Внутри он использует это для загрузки (среди прочего) основной Assertion prototype
и основной функциональности утверждения:
var assertion = require('./chai/assertion'); // primary Assertion prototype
exports.use(assertion); // load it
var core = require('./chai/core/assertions'); // core assertion functionality
exports.use(core); // load it
Один из методов, предоставляемых Assertion prototype
, — это метод addProperty
, который позволяет вам добавлять свойства к указанному prototype
.
Внутри chai
этот метод используется для добавления основной функциональности утверждений в файл Assertion prototype
. Например, таким образом добавляются все языковые цепочки и помощники утверждений (exist
, empty
и т. д.).
Языковые цепочки:
[ 'to', 'be', 'been'
, 'is', 'and', 'has', 'have'
, 'with', 'that', 'which', 'at'
, 'of', 'same' ].forEach(function (chain) {
Assertion.addProperty(chain, function () {
return this;
});
});
Вся эта функциональность становится доступной, когда внутри загружается определенный интерфейс, например expect
. Когда этот интерфейс загружен, новый Assertion prototype
будет создаваться всякий раз, когда будет выполняться expect
, который будет содержать все функции:
// load expect interface
var expect = require('./chai/interface/expect'); // expect interface
exports.use(expect); // load it
// expect interface
module.exports = function (chai, util) {
chai.expect = function (val, message) {
return new chai.Assertion(val, message); // return new Assertion Object with all functionality
};
};
Как видите, метод expect
принимает аргумент val
(и необязательный аргумент message
). При вызове этого метода (например, expect(foo)
) будет создан и возвращен новый Assertion prototype
, раскрывающий все основные функции (позволяя вам выполнять expect(foo).to.exist
).
Assertion Constructor
использует flag
util
для установки значения флага в объекте, который сопоставляется с переданным аргументом val
.
function Assertion (obj, msg, stack) {
flag(this, 'ssfi', stack || arguments.callee);
flag(this, 'object', obj); // the 'object' flag maps to the passed in val
flag(this, 'message', msg);
}
Затем exist
получает это значение через flag
util
и оценивает, не равно ли оно null
, используя метод assert
, определенный для Assertion prototype
.
Assertion.addProperty('exist', function () {
this.assert(
null != flag(this, 'object')
, 'expected #{this} to exist'
, 'expected #{this} to not exist'
);
});
person
danillouz
schedule
24.07.2015
chai
обнимает их. И вы не смотрели наshould
… - person Bergi   schedule 24.07.2015