复杂对象的Jasmine toEqual(与函数混合)

poc*_*sar 17 matcher jasmine

目前,我有一个函数,有时会返回一个内部有一些函数的对象.使用expect(...).toEqual({...})它时似乎不匹配那些复杂的对象.具有函数或File类的对象(来自输入类型文件),它就是不能.怎么克服这个?

Vla*_*lin 17

尝试Underscore _.isEqual()函数:

expect(_.isEqual(obj1, obj2)).toEqual(true);
Run Code Online (Sandbox Code Playgroud)

如果可行,您可以创建自定义匹配器:

this.addMatchers({
    toDeepEqual: function(expected) {
        return _.isEqual(this.actual, expected);
    });
});
Run Code Online (Sandbox Code Playgroud)

所以你可以编写如下规格:

expect(some_obj).toDeepEqual(expected_obj);
Run Code Online (Sandbox Code Playgroud)


poc*_*sar 13

正如Vlad Magdalin在评论中指出的那样,将对象变为JSON字符串,它可以和它一样深,并且函数和File/FileList类.当然,它不是toString()在函数上,而是可以称为'函数'

function replacer(k, v) {
    if (typeof v === 'function') {
        v = v.toString();
    } else if (window['File'] && v instanceof File) {
        v = '[File]';
    } else if (window['FileList'] && v instanceof FileList) {
        v = '[FileList]';
    }
    return v;
}

beforeEach(function(){
    this.addMatchers({
        toBeJsonEqual: function(expected){
            var one = JSON.stringify(this.actual, replacer).replace(/(\\t|\\n)/g,''),
                two = JSON.stringify(expected, replacer).replace(/(\\t|\\n)/g,'');

                return one === two;
            }
    });
});

expect(obj).toBeJsonEqual(obj2);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,JSON.stringify不保证房产订单!因此,比较生成的JSON可能会导致随机测试失败.这取决于底层的javascript运行器如何对属性进行排序.例如:测试可能在engineA(例如NodeJS)中运行时有效,但随后在engineB(例如Firefox)中或甚至在另一个engineA版本中中断.或者即使在同一版本的同一引擎中运行也会随机中断. (2认同)

Mik*_*t25 5

如果有人像我一样使用node.js,那么当我只关注比较简单属性而忽略所有函数时,我在Jasmine测试中使用以下方法.此方法需要json-stable-stringify,用于在序列化之前对对象属性进行排序.

用法:

  var stringify = require('json-stable-stringify');

  var obj1 = {
    func: function() {
    },
    str1: 'str1 value',
    str2: 'str2 value',
    nest1: {
    nest2: {
        val1:'value 1',
        val2:'value 2',
        someOtherFunc: function() {
        }
      }
    }
  };

  var obj2 = {
    str2: 'str2 value',
    str1: 'str1 value',
    func: function() {
    },
    nest1: {
      nest2: {
        otherFunc: function() {
        },
        val2:'value 2',
        val1:'value 1'
      }
    }
  };

  it('should compare object properties', function () {
    expect(stringify(obj1)).toEqual(stringify(obj2));
  });
Run Code Online (Sandbox Code Playgroud)