Есть ли способ использовать сопоставления Jasmine по умолчанию в пользовательских сопоставлениях? - PullRequest
9 голосов
/ 21 января 2012

У меня есть пользовательское сопоставление в некоторых спецификациях теста Jasmine вида:

this.addMatchers({
    checkContains: function(elem){
        var found = false;
        $.each( this.actual, function( actualItem ){

            // Check if these objects contain the same properties.
            found = found || actualItem.thing == elem;
        });
        return found;
    }
});

Конечно, actualItem.thing == elem на самом деле не сравнивает содержимое объекта - мне нужно использовать одно из более сложных решений в Сравнении объектов в JavaScript .

Не могу не заметить, однако, что у Жасмин уже есть хорошая проверка на равенство объектов: Ожидаем (x) .toEqual (y) . Есть ли способ использовать это в пользовательском сопоставителе? Есть ли какой-либо общий способ использования сопоставителей в пользовательских сопоставителях?

1 Ответ

6 голосов
/ 28 января 2012

Да, это немного странно, но вполне возможно.

Первое, что нам нужно сделать, - это сделать класс Jasmine.Env доступным.Лично я сделал это в моем SpecRunner.html, так как он уже настроен там в любом случае.При загрузке моего SpecRunner у меня работает следующий скрипт:

(function() {
      var jasmineEnv = jasmine.getEnv();
      jasmineEnv.updateInterval = 1000;

      var trivialReporter = new jasmine.TrivialReporter();

      jasmineEnv.addReporter(trivialReporter);

      jasmineEnv.specFilter = function(spec) {
        return trivialReporter.specFilter(spec);
      };

      var currentWindowOnload = window.onload;

      window.onload = function() {
        if (currentWindowOnload) {
          currentWindowOnload();
        }
        execJasmine();
      };

      function execJasmine() {
        jasmineEnv.execute();
      };

    })();

Так что после объявления функции execJasmine я помещаю jasmineEnv в глобальное пространство имен, добавляя:

this.jasmineEnv = jasmineEnv;

Теперь в любом из моих спецификационных файлов я могу получить доступ к переменной jasmineEnv, и именно она содержит основной код соответствия.

Если обратиться к toEqual, то toEqual вызывает jasmine.Env.prototype.equals_ функция.Это означает, что в вашем customMatcher вы можете выполнять следующие действия:

beforeEach(function(){
    this.addMatchers({
        isJasmineAwesome    : function(expected){
            return jasmineEnv.equals_(this.actual, expected);
        }
    });
});

К сожалению, использование этого метода даст вам доступ только к следующим методам:

  1. compareObjects_
  2. равно_
  3. содержит_

Остальные совпадения находятся в классе jasmine.Matchers, но я пока не смог сделать это открытым.Я надеюсь, что это так или иначе поможет вам

...