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
相关产品推荐
相关产品推荐

