Jest如何mock对象内部函数:解决Firebase getAuth mock时currentUser未定义报错
问题解决说明
错误原因
你犯了两个核心错误:
getAuth()是同步返回Auth对象的普通函数,不是异步函数,你用mockResolvedValueOnce会让它返回Promise对象,而Promise上没有currentUser属性,自然会报Cannot read property 'currentUser' of undefinedgetIdToken()官方返回类型是Promise<string>,你mock返回普通字符串'abc'不符合类型定义,后续拼接请求头时也会出现[object Promise]的异常值- 额外补充:你原业务代码里调用
getIdToken()没有加await,拿到的是Promise对象而非token字符串,业务逻辑本身也有问题,需要先补上await
正确mock写法
步骤1:头部mock保持不变
jest.mock("firebase/auth", () => { return { getAuth: jest.fn() } })
步骤2:测试用例内正确mock返回值
it("should login success and setUser", async () => { // 同步函数用mockReturnValue,不要用mockResolvedValue (getAuth as jest.Mock).mockReturnValueOnce({ currentUser: { // getIdToken是异步方法,返回Promise包裹的token getIdToken: jest.fn().mockResolvedValueOnce('abc') } }) // 调用你的业务方法 const result = await getUserFromDb(); // 后续断言逻辑 })
步骤3:修正原业务代码的遗漏await问题
export const getUserFromDb = async () => { const path = "/user"; // 这里必须加await,不然拿到的是Promise不是token字符串 const firebaseToken = await getAuth().currentUser?.getIdToken(); console.log(firebaseToken) const myInit = { headers: { Authorization: `token ${firebaseToken}`, }, }; return API.get(path, myInit); };
额外适配场景:currentUser为空的情况
如果要测试用户未登录的场景,只需要把currentUser设为null即可:
(getAuth as jest.Mock).mockReturnValueOnce({ currentUser: null })
此时getIdToken()不会执行,firebaseToken值为undefined,符合可选链的逻辑。
内容的提问来源于stack exchange,提问作者ken
相关产品推荐
相关产品推荐

