javascript – 在对象数组上使用Jest属性匹配器

前端之家收集整理的这篇文章主要介绍了javascript – 在对象数组上使用Jest属性匹配器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图使用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>,}
`;

总之,直接传递数组以与属性匹配器一起使用不起作用,并且可能会使用属性匹配器对其他快照测试产生负面影响.

原文链接:https://www.f2er.com/js/157247.html

猜你在找的JavaScript相关文章