gio*_*lio 15 javascript testing jestjs
我试图使用Jest的新属性匹配器功能(自Jest 23.0.0)来匹配包含生成字段的对象数组.我尝试使用普通对象和匹配器定义,expect.arrayContaining并且expect.objectContaining像手动匹配时一样.目前有什么办法吗?
const sportsBallPeople = [
{
createdAt: new Date(),
name: 'That one famous guy from Cleveland'
},
{
createdAt: new Date(),
name: 'That tall guy'
}
];
expect(sportsBallPeople).toMatchSnapshot(<something goes here>);
Run Code Online (Sandbox Code Playgroud)
Bri*_*ams 17
版本信息
正如在问题中所指出的,属性匹配器是在Jest 23.0.0中引入的.请注意,截至今天(2018年8月5日),使用create-react-app引导的应用程序仍然<23.
宾语
以下是使用单个对象的属性匹配器的示例:
test('sportsBallPerson', () => {
expect(sportsBallPeople[0]).toMatchSnapshot({
createdAt: expect.any(Date)
})
});
Run Code Online (Sandbox Code Playgroud)
生成的快照:
exports[`sportsBallPerson 1`] = `
Object {
"createdAt": Any<Date>,
"name": "That one famous guy from Cleveland",
}
`;
Run Code Online (Sandbox Code Playgroud)
这将正确地将createdAt与任何日期和名称完全匹配为"那个来自克利夫兰的名人".
ARRAY
要使用属性匹配器测试对象数组,请使用forEach循环遍历数组并快照单独测试每个对象:
test('sportsBallPeople', () => {
sportsBallPeople.forEach((sportsBallPerson) => {
expect(sportsBallPerson).toMatchSnapshot({
createdAt: expect.any(Date)
});
});
});
Run Code Online (Sandbox Code Playgroud)
生成的快照:
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",
}
`;
Run Code Online (Sandbox Code Playgroud)
forEach确保按顺序测试对象,并且如上所述对每个对象进行适当的快照测试.
附加信息
有趣的是,使用属性匹配器直接测试数组不能正常工作并且具有意外的副作用.
我第一次尝试测试数组是为了创建以下测试:
test('sportsBallPeople as array', () => {
expect(sportsBallPeople).toMatchSnapshot([
{ createdAt: expect.any(Date) },
{ createdAt: expect.any(Date) }
]);
});
Run Code Online (Sandbox Code Playgroud)
它生成了以下快照:
exports[`sportsBallPeople as array 1`] = `
Array [
Object {
"createdAt": Any<Date>,
},
Object {
"createdAt": Any<Date>,
},
]
`;
Run Code Online (Sandbox Code Playgroud)
这是不正确的,因为缺少名称属性,但测试仍然通过(Jest v23.4.2).即使更改了名称并添加了其他属性,测试也会通过.
更有趣的是,一旦执行此测试,使用属性匹配器的任何后续测试都会受到不利影响.例如,将此测试放在测试循环对象之前将这些快照更改为以下内容:
exports[`sportsBallPeople 1`] = `
Object {
"createdAt": Any<Date>,
}
`;
exports[`sportsBallPeople 2`] = `
Object {
"createdAt": Any<Date>,
}
`;
Run Code Online (Sandbox Code Playgroud)
总之,直接传递数组以与属性匹配器一起使用不起作用,并且可能会使用属性匹配器对其他快照测试产生负面影响.
| 归档时间: |
|
| 查看次数: |
7203 次 |
| 最近记录: |