如何将我的自定义匹配器从Jasmine 1迁移到Jasmine 2

时间:2016-05-31 08:40:52

标签: javascript unit-testing jasmine

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属性的对象。

我正在寻找一种简单的方法来迁移我们现有的匹配器,以便我们可以轻松切换到新的茉莉花版本。

2 个答案:

答案 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兼容的匹配器。