2012-01-20 44 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()。 –

相关问题