Пользовательские жасминовые матчи и транспортир

Мы добавили пользовательский jasmine-коннектор toHaveClass, и для его работы нам пришлось добавить его в beforeEach() (с помощью в этом разделе).

И, чтобы следовать принципу DRY и избегать повторения определения matcher в каждом beforeEach() в спецификациях, где toHaveClass необходимо, мы добавили блок beforeEach() прямо в onPrepare():

onPrepare: function () {
    var jasmineReporters = require("jasmine-reporters");
    require("jasmine-expect");

    // ...

    // custom matchers
    beforeEach(function() {
        jasmine.addMatchers({
            toHaveClass: function() {
                return {
                    compare: function(actual, expected) {
                        return {
                            pass: actual.getAttribute("class").then(function(classes) {
                                return classes.split(" ").indexOf(expected) !== -1;
                            })
                        };
                    }
                };
            }
        });
    });
},

На самом деле это работает, но каждый раз, когда я вижу блок beforeEach() внутри конфигурации транспортира, у меня есть микро-депрессия и сильное чувство, что это нехорошее место для определения совпадений.

Вопрос:

Есть ли лучший способ или место для определения пользовательских совпадений?

Ответы

Ответ 1

Самое простое решение, которое я вижу, - переместить этот блок beforeEach в отдельный файл и потребовать его внутри onPrepare, как вы это делаете с поставщиками:

onPrepare: function () {
    var jasmineReporters = require("jasmine-reporters");
    require("jasmine-expect");
    require('./tests/support/jasmine-custom-matchers'); // inject custom matchers
    // ....
}

Код beforeEach не должен содержать никаких изменений:

// /tests/support/jasmine-custom-matchers.js

beforeEach(function() {
    jasmine.addMatchers({
        toHaveClass: function() {
            return {
                compare: function(actual, expected) {
                    return {
                        pass: actual.getAttribute("class").then(function(classes) {
                            return classes.split(" ").indexOf(expected) !== -1;
                        })
                    };
                }
            };
        }
    });
});

Я не думаю, что вы должны export что-то из этого файла, но это вступит в силу только с помощью require -ing.