Jest API测试出现误通过:未实现路由却显示测试通过
问题原因与解决方案
为什么测试会全部通过?
你的测试用例存在异步操作未被Jest等待的核心问题:
- supertest发送HTTP请求是异步行为,但你的测试函数既没有返回请求的Promise,也没有用
async/await语法告知Jest需要等待异步操作完成。 - Jest默认认为同步代码执行完毕后测试就结束,因此会直接标记测试通过,完全不会执行后续的断言逻辑,自然也不会发现实际返回的404状态码与期望的207/200不符。
修复方案
你需要让Jest等待异步请求完成,有两种常用实现方式:
方式1:返回请求的Promise
修改测试函数,返回supertest的请求链,Jest会自动等待这个Promise完成后再判断测试结果:
const request = require('supertest') const api = require('../api-server') const pmOne = { name: "Some Name", tel: "234 123" } const pmTwo = { name: "Some Other Name", tel: "256 789" } describe('Basic CRUD API', () =>{ // 注意:原描述是GET,但实际用了POST,建议修正描述保证一致性 it('POST /pm --> create projectmanager', () =>{ // 返回Promise,让Jest等待异步操作完成 return request(api) .post('/pm') .send(pmTwo) .expect(404) // 路由未实现,应该期望404状态码 }) it('GET /pm/id --> get projectmanager', () => { // 先定义未声明的pmOneId变量 const pmOneId = 'test-id'; // 返回Promise return request(api) .get('/pm/' + pmOneId) .expect(404) // 路由未实现,期望404状态码 .then((res) => { // 注意:路由未实现时res.body为空,这里的断言会失败,属于合理结果 expect(res.body.name).toBe(pmOne.name) expect(res.body.tel).toBe(pmOne.tel) }) }) })
方式2:使用async/await语法
这种方式代码可读性更强,是更推荐的写法:
const request = require('supertest') const api = require('../api-server') const pmOne = { name: "Some Name", tel: "234 123" } const pmTwo = { name: "Some Other Name", tel: "256 789" } describe('Basic CRUD API', () =>{ it('POST /pm --> create projectmanager', async () =>{ await request(api) .post('/pm') .send(pmTwo) .expect(404) }) it('GET /pm/id --> get projectmanager', async () => { const pmOneId = 'test-id'; const res = await request(api) .get('/pm/' + pmOneId) .expect(404) // 路由未实现时res.body无数据,该断言会失败,符合预期 expect(res.body.name).toBe(pmOne.name) expect(res.body.tel).toBe(pmOne.tel) }) })
额外注意事项
- 描述与请求方法不符:第一个测试描述是
GET /pm,但实际调用的是post('/pm'),建议修正描述保证逻辑一致性。 - 未定义变量:原测试中
pmOneId未声明,会导致请求路径变为/pm/undefined,需要先定义该变量或调整测试逻辑。 - 断言合理性:路由未实现时服务器返回404,响应体通常为空,此时
expect(res.body.name)这类断言会失败,这是符合预期的——因为路由确实未提供对应数据。
内容的提问来源于stack exchange,提问作者user234458
相关产品推荐
相关产品推荐

