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

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)

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

  • 感谢您的实验,经过更多的自学,我得出了相同的结论。我想我会将其作为Jest跟踪器上的功能请求。 (2认同)
  • 如果您创建了@giodamelio,可以共享特征请求链接吗? (2认同)
  • @ChristianRondeau也许这个问题https://github.com/facebook/jest/pull/7089 (2认同)