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

如何在Jest中测试代码路径未执行?catch块触发会自动失败吗?

Jest中验证代码路径未执行及catch分支触发的测试判定问题

核心问题解答

  1. 能否验证某条代码路径未被执行?
    可以,Jest提供多种方式确保特定分支不被执行,下面结合你的代码给出具体实现。

  2. catch分支触发且内部无expect断言时,Jest会自动判定测试失败吗?
    不会。当前代码中,如果homepageHandler抛出错误进入catch分支,Jest不会自动标记测试失败——因为catch分支里没有失败断言,甚至可能在异步操作未完成时就结束测试,误判为通过。

正确测试写法

你的原代码存在异步处理漏洞:未等待homepageHandler的Promise完成,Jest会直接结束测试,导致then/catch内的逻辑可能根本没执行。以下是修正后的方案:

写法1:async/await 直接验证成功路径

describe('Endpoints are accessible', () => {
  it('GET request for homepage should return 200', async () => {
    const baseURL = process.env.EXPRESS_SERVER_TEST
    console.log(`base url is ${baseURL}`)

    const req = {}
    const res = {}

    // 用await等待Promise完成,确保断言执行
    const result = await indexControllerModule.homepageHandler(req, res)
    expect(result).toBe(
      JSON.stringify({
        message: 'welcome',
      })
    )

    // 若进入catch分支,await会抛出错误,Jest自动标记测试失败
  })
})

写法2:显式禁止catch分支执行

如果需要明确断言“catch分支绝对不能触发”,可以用expect.assertions()指定断言数量,结合resolves语法反向验证:

describe('Endpoints are accessible', () => {
  it('GET request for homepage should return 200 and not trigger catch', async () => {
    const req = {}
    const res = {}

    // 指定必须执行1个断言,防止测试提前结束
    expect.assertions(1)
    
    // 验证Promise不会被reject(即catch分支不执行)
    await expect(indexControllerModule.homepageHandler(req, res)).resolves.toBe(
      JSON.stringify({
        message: 'welcome',
      })
    )
  })
})

写法3:try/catch 主动捕获错误并标记失败

describe('Endpoints are accessible', () => {
  it('GET request for homepage should return 200', async () => {
    const req = {}
    const res = {}
    try {
      const result = await indexControllerModule.homepageHandler(req, res)
      expect(result).toBe(JSON.stringify({ message: 'welcome' }))
    } catch (error) {
      // 进入catch分支时主动标记测试失败
      fail(`Unexpected error triggered catch branch: ${error}`)
    }
  })
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:52:39