Jestjs toEqual的变体,其处理类属性的方式与处理类方法的方式相同

Jestjs toEqual的变体,其处理类属性的方式与处理类方法的方式相同,jestjs,babeljs,class-properties,Jestjs,Babeljs,Class Properties,情况就是这样。第一个类有一个方法getName,第二个类有一个类属性getName。第一个类与toEqual一起工作,第二个类则不工作 class Person01 { constructor(name) { this.name = name; } getName() { return this.name; } } class Person02 { constructor(name) { this.name = name; } getName = () =>

情况就是这样。第一个类有一个方法
getName
,第二个类有一个类属性
getName
。第一个类与
toEqual
一起工作,第二个类则不工作

class Person01 {
    constructor(name) { this.name = name; }
    getName() { return this.name; }
}

class Person02 {
    constructor(name) { this.name = name; }
    getName = () => { return this.name; }
}

const testCases = [
    [
        // passes
        new Person01('Alan', 'Kay'),
        new Person01('Alan', 'Kay'),
    ], 
    [
        // fails due to class properties
        new Person02('Alan', 'Kay'),
        new Person02('Alan', 'Kay'),
    ]
];

describe('when one class has the same values that another class has', () =>
    testCases.forEach(pair =>
        it('is considered to be equal to that class', () =>
            expect(pair[0]).toEqual(pair[1]))));
这是第二个类的失败消息

Expected: {"firstName": "Alan", "getName": [Function anonymous], "lastName": "Kay"} 
Received: {"firstName": "Alan", "getName": [Function anonymous], "lastName": "Kay"} 
我们当前的解决方法是对实际值和预期值运行
JSON.parse(JSON.stringify(obj))

相反,我们要寻找的是
toEqual
的一个变体,它对类属性的处理方式与对类方法的处理方式相同

这是我们的babel.config.js文件

module.exports = function (api) {

  api.env();

  const plugins = [
    "@babel/proposal-class-properties",
  ];

  return {
    plugins,
  };
}

问题是函数类属性是按实例创建的

…因此,
toEqual
失败,因为每个实例都有一组不同的函数属性


一个选项是创建一个新的,但这很棘手,因为
toEqual

另一种选择是在使用
toEqual
之前只过滤函数属性:

const filterFunctions=(obj)=>
对象键(obj)
.filter(k=>typeof obj[k]!=='function')
.reduce((a,k)=>{a[k]=obj[k];返回a;},{});
description('当一个类的值与另一个类的值相同时',()=>
testCases.forEach(对=>
它('被认为等于该类',()=>
expect(filterFunctions(对[0]))。toEqual(filterFunctions(对[1]));//成功!

这里的一个困难是,
filterFunctions
还将过滤方法。此外,完整的答案需要递归步骤来过滤嵌套对象中的函数。