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

Jest无法检测到函数调用?异步登录方法测试问题求助

问题排查与解决方案

1. 确认authService.login的Mock返回值类型

你的问题大概率是Mock没有返回resolved状态的Promise,导致await阻塞,测试断言先于res.cookie执行。

错误示例(返回非Promise值):

jest.spyOn(authService, 'login').mockReturnValue('fake-token')

正确写法必须返回Promise:

// 推荐用mockResolvedValue直接返回成功的Promise
jest.spyOn(authService, 'login').mockResolvedValue('fake-token')

// 或者用mockImplementation手动返回Promise
jest.spyOn(authService, 'login').mockImplementation(() => Promise.resolve('fake-token'))

2. 测试函数必须等待异步逻辑完成

如果测试里没等待authController.login这个异步方法执行完,断言会在res.cookie调用前执行,自然会失败。

错误示例(未等待异步):

test('login sets cookie', () => {
  const res = { cookie: jest.fn() }
  authController.login(req, res)
  expect(res.cookie).toHaveBeenCalled()
})

正确写法(用async/await等待):

test('login sets cookie', async () => {
  const res = { cookie: jest.fn() }
  // 必须await异步方法,确保所有逻辑执行完毕再断言
  await authController.login(req, res)
  expect(res.cookie).toHaveBeenCalled()
})

3. 检查Mock状态是否残留

如果多个测试共用同一个Mock实例,前一次测试的Mock状态可能影响当前测试。建议在每个测试前重置Mock:

beforeEach(() => {
  jest.clearAllMocks()
})

4. 验证Mock的调用参数是否匹配

如果authService.login的Mock设置了参数匹配条件,但实际调用的参数不满足,会导致Promise无法正常resolve。可以添加断言检查Mock的调用情况:

expect(authService.login).toHaveBeenCalledWith(expect.any(String), expect.any(String))
// 替换成你实际需要的参数匹配规则

5. 排查错误分支的影响

如果authController.login里有try/catch逻辑,而你Mock的authService.login返回了rejected状态的Promise,会进入catch分支跳过res.cookie的执行。此时要确保Mock返回的是resolved状态,或者单独测试错误分支。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:23:01