Cypress API测试:如何让接口返回204或400时测试均通过?
解决方案
1. 修正状态码断言逻辑
你之前用的expect(response.status).to.eq(204||400)无效,是因为JavaScript中204||400会直接返回204(第一个真值),相当于只断言状态码等于204,400的情况自然会失败。正确的做法是断言状态码属于允许的集合:
- 若使用Chai测试框架:
// 断言状态码是204或400中的一个 expect(response.status).to.be.oneOf([204, 400]);
- 若使用Jest测试框架:
expect([204, 400]).toContain(response.status);
2. 可选:验证400响应的内容(避免204时报错)
如果需要确保400响应的内容符合预期,不要直接断言response.body——因为204响应通常没有响应体,直接访问会报错。应该先判断状态码,再做对应的断言:
expect(response.status).to.be.oneOf([204, 400]); // 仅当状态码为400时验证响应体 if (response.status === 400) { expect(response.body.error).to.eq('invalidPasswordHistoryMessage'); expect(response.body.error_description).to.eq('Invalid password: must not be equal to any of last 24 passwords.'); }
3. 确保响应体正确解析
如果之前检查response.body失败,可能是测试框架没有自动解析JSON响应。比如用Supertest时,可手动处理解析:
const response = await request(app) .post('/set-password') .send({ password: 'your-fixed-password' }); // 仅在400状态下手动解析响应体(若框架未自动处理) let body; if (response.status === 400) { body = JSON.parse(response.text); expect(body.error).to.eq('invalidPasswordHistoryMessage'); }
内容的提问来源于stack exchange,提问作者knalepa
相关产品推荐
相关产品推荐

