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