Создание кастомного матчера для unit тестирования в Jasmine 2.0

Создание кастомного матчера для unit тестирования в Jasmine 2.0

477

Не так давно столкнулся с необходимостью написать кастомный матчер в jasmine. Первым же делом начал гуглить и отыскал пример , где все верно и понятно объяснено. Фактически код представлен ниже:

describe(‘Hello world’, function () {
beforeEach(function() {
this.addMatchers({
toBeWithinOf: function(distance, base) {
this.message = function() {
var lower = base — distance,
upper = base + distance;
return "Expected " + this.actual + " to be between " +
lower + " and " + upper + " (inclusive)";
};
return Math.abs(this.actual — base) <= distance;
}
});
});
it(‘should be within in range’, function () {
expect(8).toBeWithinOf(2, 6);
});
});

Заметьте, при вызове матчера передается два параметра:base — число от которого будет отсчитываться в обе стороны некоторая величина — distance, в итоге образуя интервал поиска — [base — distance, base + distance]. Раз же данное юзером число будет вне интервала, то в тестах мы увидим ошибку, которою формируем с помощью функции this.message. В этом примере создается матчер, который будет докладывать о том, находиться ли введенное число (this.actual) в неком интервале. В данном случае мы ожидаем, что 8 будет в интервале [4, 8].

Всё вроде ничего, но при запуске примера в jasmine 2.0 ничего из этого не работает. Оказывается, незначительно поменялся синтаксис.

Перепробовал кучу методов и облазив не один форум я сумел решить данный вопросец. Код решения имеет последующий вид:

describe(‘Hello world’, function () {
beforeEach(function () {
jasmine.addMatchers({
toBeWithinOf: function () {
return {
compare: function (actual, distance, base) {
var lower = base — distance,
upper = base + distance,
result = {
pass: Math.abs(actual — base) <= distance
};

if(!result.pass) {
result.message = "Expected " + actual + " to be between " +
lower + " and " + upper + " (inclusive)";
}
return result;
}
}
}
})
});
it(‘should be within in range’, function () {
expect(8).toBeWithinOf(2, 6);
});
});
Как можно увидеть, был изменен метод вызова функции прибавления матчеров — (this.addMatchers -> jasmine.addMatchers). Также из самой функции мы обязаны возвращать объект, в котором должен быть объявлен способ compare, который и воспринимает все характеристики, а не сама функция матчер.

Обратите внимание, что 1-ый параметр(actual) соответствует числу, которое мы желаем инспектировать, и раз нам требуется в сам матчер передавать свои характеристики (как в нашем случае — base и distance), то можно указать их там же.

И лишь раз это свойство в итоге не отрабатывает, то уже лишь тогда создается свойство message, в котором можно сформировать текст, который увидит юзер при ошибке теста. Снутри самой функции compare мы создаем объект, в который сходу же записываем свойство сопоставления (pass).

Ссылку на рабочий пример можно отыскать тут — fiddle.

habrahabr.ru На этом все.