2012-01-20 48 views
8

我在形式的一些茉莉花測試規格定製的匹配:有沒有什麼辦法在自定義匹配器中使用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不實際的比較對象盒內我不得不使用更復雜的解決方案之一Object comparison in JavaScript

不過,我不禁注意到,茉莉已經有一個很好的對象平等檢查器:expect(x).toEqual(y)。有沒有什麼方法可以在自定義匹配器中使用它?在自定義匹配器中是否有任何通用的方式來使用匹配器?

回答

5

是的,這是有點hacky,但完全有可能。

我們需要做的第一件事是使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; 

現在,在我的任何spec文件中,我都可以訪問jasmineEnv變量,這就是包含matchers核心代碼的東西。

特別注意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_

其餘的匹配者駐留在jasmine.Matchers類,但我沒有b能夠讓公衆瞭解。我希望這可以幫助你在某個方面或另一個

+0

真棒,謝謝!這可能是我尋找的解決方案(您提供的解決方案)比我試圖避免的問題(我自己的對象相等檢查器)更糟的情況。儘管如此,非常酷。 – Fishtoaster

+0

如果您想在另一個自定義匹配器B中使用自定義匹配器A,則可以將匹配器A的邏輯添加到jasmine.Env.prototype,然後使用jasmine.getEnv從匹配器B中調用該日誌).myMatcherFn()。 –

相關問題