2012-01-20 5 views
8

У меня есть пользовательский Искатель в некоторых тестовых спецификациях Jasmine вида:Есть ли способ использовать шаблоны по умолчанию 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 на самом деле не сравнить объект contents- я должен использовать один из более сложных решений в Object comparison in JavaScript.

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

ответ

5

Да, это немного хакки, но вполне возможно.

Первое, что нам нужно сделать, это сделать доступным класс 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. equals_
  3. contains_

Остальные согласные находятся в жасмине. Класс учеников, но у меня нет b в состоянии сделать эту публикацию еще. Я надеюсь, что это поможет вам в любом случае

+0

Удивительно, спасибо! Это может быть случай, когда решение, которое я искал (тот, который вы дали), хуже, чем проблема, которую я пытался избежать (моя собственная проверка равенства объектов). Тем не менее, очень здорово. – Fishtoaster

+0

Если вы хотите использовать пользовательский матчи A внутри другого пользовательского совпадения B, вы можете добавить логику для вашего матчи A к jasmine.Env.prototype, а затем вызвать этот журнал из вашего матчи B с помощью jasmine.getEnv () .myMatcherFn(). –