是的,这是有点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);
}
});
});
不幸的是,使用这种方法只会让您使用以下方法:
- compareObjects_
- equals_
- contains_
其余的匹配者驻留在jasmine.Matchers类,但我没有b能够让公众了解。我希望这可以帮助你在某个方面或另一个
真棒,谢谢!这可能是我寻找的解决方案(您提供的解决方案)比我试图避免的问题(我自己的对象相等检查器)更糟的情况。尽管如此,非常酷。 – Fishtoaster
如果您想在另一个自定义匹配器B中使用自定义匹配器A,则可以将匹配器A的逻辑添加到jasmine.Env.prototype,然后使用jasmine.getEnv从匹配器B中调用该日志).myMatcherFn()。 –