我在一些 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 中更复杂的解决方案之一。 .
不过,我不禁注意到 Jasmine 已经有了一个不错的对象相等性检查器:expect(x).toEqual(y) .有没有办法在自定义匹配器中使用它?有没有在自定义匹配器中使用匹配器的通用方法?
最佳答案
是的,这有点 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;
现在,在我的任何规范文件中,我都可以访问 jasmineEnv 变量,它包含匹配器核心代码。
具体来看 toEqual,toEqual 调用 jasmine.Env.prototype.equals_ 函数。这意味着在您的 customMatcher 中,您可以执行以下操作:
beforeEach(function(){
this.addMatchers({
isJasmineAwesome : function(expected){
return jasmineEnv.equals_(this.actual, expected);
}
});
});
不幸的是,使用此方法只会让您访问以下方法:
- 比较对象_
- 等于_
- 包含_
其余的匹配器位于 jasmine.Matchers 类中,但我还不能将其公开。我希望这能以某种方式帮助你
关于javascript - 有没有办法在自定义匹配器中使用 Jasmine 默认匹配器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8947787/