You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
    })
})

额外注意事项

  1. 描述与请求方法不符:第一个测试描述是GET /pm,但实际调用的是post('/pm'),建议修正描述保证逻辑一致性。
  2. 未定义变量:原测试中pmOneId未声明,会导致请求路径变为/pm/undefined,需要先定义该变量或调整测试逻辑。
  3. 断言合理性:路由未实现时服务器返回404,响应体通常为空,此时expect(res.body.name)这类断言会失败,这是符合预期的——因为路由确实未提供对应数据。

内容的提问来源于stack exchange,提问作者user234458

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:36:33