toEqual的变体,其与类属性一起使用的方式与对类方法的使用方式相同

时间:2019-04-08 21:57:01

标签: jestjs babel class-properties

这是场景。第一类具有方法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,
  };
}

1 个答案:

答案 0 :(得分:1)

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

...所以toEqual失败,因为每个实例都有一组不同的函数属性。


一个选择是创建一个custom matcher,但这很麻烦,因为toEqual is doing a lot

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

const filterFunctions = (obj) => 
  Object.keys(obj)
    .filter(k => typeof obj[k] !== 'function')
    .reduce((a, k) => { a[k] = obj[k]; return a; }, {});

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(filterFunctions(pair[0])).toEqual(filterFunctions(pair[1])))));  // Success!