Как стать автором
Обновить

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

Время на прочтение 2 мин
Количество просмотров 4K
Недавно столкнулся с необходимостью написать кастомный матчер в 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);
    });
});


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

Всё вроде ничего, но при запуске примера в 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, который и принимает все параметры, а не сама функция матчер.

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

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

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

На этом все.
Теги:
Хабы:
+6
Комментарии 3
Комментарии Комментарии 3

Публикации

Истории

Работа

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн