我试图使用Jest的新
Property Matcher功能(自
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>);
解决方法
版本信息
正如问题中所指出的,财产匹配器是在Jest 23.0.0中引入的.请注意,截至今天(2018年8月5日),使用create-react-app引导的应用仍然是< 23. 宾语 以下是使用属性匹配器对单个对象的示例:
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与任何日期和名称完全匹配为“那个来自克利夫兰的名人”.
ARRAY
要使用属性匹配器测试对象数组,请使用forEach循环遍历数组并快照单独测试每个对象:
test('sportsBallPeople',() => { sportsBallPeople.forEach((sportsBallPerson) => { expect(sportsBallPerson).toMatchSnapshot({ createdAt: expect.any(Date) }); }); });
生成的快照:
exports[`sportsBallPeople 1`] = ` Object { "createdAt": Any<Date>,} `; 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>,} `;