如何在Jest中校验res.body.data数组是否为空及元素是否包含id字段
Jest 校验逻辑实现
你可以按照以下两种方式实现需求,根据你的测试场景选择即可:
方式1:单条用例兼容空/非空两种情况
适合同一条用例可能返回空或非空结果的场景:
test('校验res.body.data格式合法性', () => { // 第一步先校验返回值一定是数组类型 expect(res.body.data).toBeInstanceOf(Array) // 数组非空时再校验每个元素的id字段 if (res.body.data.length > 0) { res.body.data.forEach(item => { // 校验对象存在id字段,可根据需求补充id的类型校验 expect(item).toHaveProperty('id') // 示例:如果要求id是数字类型,可加下一行 // expect(typeof item.id).toBe('number') }) } })
方式2:分场景写专用用例
适合分别测试空返回、非空返回的场景,测试覆盖更清晰:
- 空返回测试用例
test('无数据时返回空数组', async () => { // 模拟无数据的请求场景 const res = await request(yourApp).get('/your/request/path') expect(res.body.data).toEqual([]) })
- 非空返回测试用例
test('有数据时所有返回对象都带id字段', async () => { // 提前构造测试数据,保证接口有返回 await mockDatabaseHasData() const res = await request(yourApp).get('/your/request/path') // 先确认数组非空 expect(res.body.data.length).toBeGreaterThan(0) // 校验所有元素都包含id字段 res.body.data.forEach(item => { expect(item).toEqual( expect.objectContaining({ id: expect.any(Number) // 可替换为expect.any(String)匹配字符串类型id }) ) }) })
如果对校验精度要求不高,也可以直接把非空判断和字段校验合并成一条逻辑,即使数组为空时,forEach也不会执行,不会抛出断言错误。
内容的提问来源于stack exchange,提问作者HexaCrop
相关产品推荐
相关产品推荐

