Недавно я столкнулся с необходимостью написать собственное средство сопоставления в 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); }); });
фактическое ) в определенном интервале.
Обратите внимание, что при вызове сопоставителя передаются два параметра: база - число, от которого будет отсчитываться определенная величина в обе стороны - расстояние , в конечном итоге образуя интервал поиска - [база – расстояние, база + расстояние] .
В этом случае мы ожидаем, что 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 ).
Также из самой функции мы вынуждены возвращать объект, в котором должен быть объявлен метод сравнивать , который принимает все параметры, а не саму функцию сопоставления.
Обратите внимание, что первый параметр( действительный ) соответствует числу, которое мы хотим проверить, и если нам нужно передать наши параметры самому сопоставителю (как в нашем случае — базу и расстояние), то мы можем указать их там.
Внутри самой функции сравнения мы создаем объект, в который сразу записываем свойство сравнения ( проходить ).
И только если это свойство в конечном итоге не работает, только тогда свойство создается сообщение , в котором вы можете сгенерировать текст, который увидит пользователь, если тест не пройден.
Ссылку на рабочий пример можно найти здесь — скрипка .
Вот и все.
Теги: #tdd #bdd #jasmine #пользовательские сопоставления #тестирование #JavaScript #JavaScript #tdd #Тестирование веб-сервисов
-
Это 1.1.19
19 Oct, 24 -
Сфинкс??
19 Oct, 24