版本信息
如问题中所述,Jest 23.0.0 中引入了属性匹配器。请注意,截至今天(2018 年 8 月 5 日),使用 create-react-app 引导的应用程序仍为
对象
下面是一个对单个对象使用属性匹配器的示例:
test('sportsBallPerson', () => {
expect(sportsBallPeople[0]).toMatchSnapshot({
createdAt: expect.any(Date)
})
});
生成的快照:
exports[`sportsBallPerson 1`] = `
Object {
"createdAt": Any<Date>,
"name": "That one famous guy from Cleveland",
}
`;
这将正确地将 createdAt 匹配到任何日期,并将名称与“来自克利夫兰的那个著名人物”完全匹配。
阵列
要使用属性匹配器测试对象数组,请使用 forEach 循环遍历数组并分别对每个对象进行快照测试:
test('sportsBallPeople', () => {
sportsBallPeople.forEach((sportsBallPerson) => {
expect(sportsBallPerson).toMatchSnapshot({
createdAt: expect.any(Date)
});
});
});
生成的快照:
exports[`sportsBallPeople 1`] = `
Object {
"createdAt": Any<Date>,
"name": "That one famous guy from Cleveland",
}
`;
exports[`sportsBallPeople 2`] = `
Object {
"createdAt": Any<Date>,
"name": "That tall guy",
}
`;
forEach 确保按顺序测试对象,并且如上所述对每个对象进行适当的快照测试。
其他信息
有趣的是,使用属性匹配器直接测试数组不能正常工作并且有意想不到的副作用。
我第一次尝试测试数组是创建以下测试:
test('sportsBallPeople as array', () => {
expect(sportsBallPeople).toMatchSnapshot([
{ createdAt: expect.any(Date) },
{ createdAt: expect.any(Date) }
]);
});
它生成了以下快照:
exports[`sportsBallPeople as array 1`] = `
Array [
Object {
"createdAt": Any<Date>,
},
Object {
"createdAt": Any<Date>,
},
]
`;
这是不正确的,因为缺少名称属性,但测试仍然通过(Jest v23.4.2)。即使更改了名称并添加了其他属性,测试也通过了。
更有趣的是,一旦执行此测试,任何使用属性匹配器的后续测试都会受到不利影响。例如,将此测试放在对对象循环的测试之前会将这些快照更改为以下内容:
exports[`sportsBallPeople 1`] = `
Object {
"createdAt": Any<Date>,
}
`;
exports[`sportsBallPeople 2`] = `
Object {
"createdAt": Any<Date>,
}
`;
总之,直接传递一个数组以与属性匹配器一起使用是行不通的,并且可能会对使用属性匹配器的其他快照测试产生负面影响。