JavaScript测试框架jasmine的第2版不幸引入了几个重大变化。其中一个变化是自定义匹配器的处理方式,如下所述:
http://jasmine.github.io/2.0/upgrading.html
addMatchers函数不再出现在规范(this)上,它现在位于全局jasmine对象上。
/* was: this.addMatchers({ */ jasmine.addMatchers({
匹配器现在设置有点不同。工厂接收一个util对象,其中包含jasmines相等函数和任何已注册的customEqualityTesters。工厂应该返回一个带有比较函数的对象,该函数将直接用实际和预期调用,而不是实际值在此
/* was: toBeCustom: function(expected) { var passed = this.actual == expected; */ toBeCustom: function(util, customEqualityTesters) { return { compare: function(actual, expected) { var passed = actual == expected
现在,比较应该返回一个带有pass和message属性的对象。
我正在寻找一种简单的方法来迁移我们现有的匹配器,以便我们可以轻松切换到新的茉莉花版本。
答案 0 :(得分:0)
为了简化向新jasmine版本的过渡,以下特殊迁移对象将有所帮助。
不是在此对象上添加匹配器,而是将它们添加到jasmineMigrate对象上。但这真的是你需要的。 jasmineMigrate对象将负责其余部分。
/* was:
this.addMatchers({
*/
jasmineMigrate .addMatchers({
迁移对象的实现:
var jasmineMigrate = {};
jasmineMigrate.addMatchers = function (matchers) {
Object.keys(matchers).forEach(function (matcherName) {
var matcher = matchers[matcherName],
migratedMatcher = {};
migratedMatcher[matcherName] = function (util, customEqualityTesters) {
return {
compare: function (actual) {
var matcherArguments,
thisForMigratedMatcher,
matcherResult,
passed;
//In Jasmine 2 the first parameter of the compare function
//is the actual value.
//Whereas with Jasmine 1 the actual value was a property of the matchers this
//Therefore modify the given arguments array and remove actual
matcherArguments = [].slice.call(arguments)
matcherArguments.splice(0, 1);
//Add actual to the this object we'll be passing to the matcher
thisForMigratedMatcher = {
actual: actual
};
//Now call the original matcher aufgerufen, with the modified
//arguments and thisForMigratedMatcher which will be applied to
//the matcher
passed = matcher.apply(thisForMigratedMatcher, matcherArguments);
matcherResult = {
pass: passed,
message: thisForMigratedMatcher.message
};
return matcherResult;
}
}
};
jasmine.addMatchers(migratedMatcher);
});
}
答案 1 :(得分:0)
add-matchers库允许您编写与Jasmine v1,Jasmine v2和Jest兼容的匹配器。