我有一个函数,将调用Firebase和getIdToken
函数
export const getUserFromDb = async () => {
const path = "/user";
const firebaseToken = getAuth().currentUser?.getIdToken(); // here need to get it
console.log(firebaseToken)
const myInit = {
headers: {
Authorization: `token ${firebaseToken}`,
},
};
return API.get(path, myInit);
};
如何模拟这行代码?
const firebaseToken = getAuth().currentUser?.getIdToken();
详情:
getAuth()
是一个从Firebase返回Auth
对象的方法。
currentUser
是Auth
对象的属性,User
类型。
getIdToken()
是currentUser
的一个方法,它将返回Promise<string>
所以这就是我所尝试的。
我试过了:
我在测试文件的开头模拟了getAuth()
,getAuth()
是一个函数,jest.fn()
也是。
jest.mock("firebase/auth", () =>{返回{getAuth: jest.fn ()}}
然后在我的一个测试用例中,我尝试了这个:
it("should login success and setUser", async () => {
(getAuth as jest.Mock).mockResolvedValueOnce({
currentUser: {
getIdToken: jest.fn().mockReturnValueOnce('abc')
}
})
// other stuff here
}
可以看到,我模拟getAuth()
函数返回一个currentUser
对象。然后getIdToken()
函数在currentUser
对象内部,它将返回一个字符串。
但是当我运行测试时,我得到这个错误:
console.logTypeError:无法读取未定义的属性"currentUser">
说明currentUser
是undefined。但是由于我在测试开始时输入了mockResolvedValueOnce
,但是仍然无法得到currentUser
的值。
如何模拟这个函数?我做错了什么?
const firebaseToken = getAuth().currentUser?.getIdToken();
这对我有用:
const getAuth = jest.fn(() => ({
currentUser: {
getIdToken: () => 32,
}
}));
最后我像这样模拟它:
(getAuth as jest.Mock).mockReturnValue({
currentUser: {
getIdToken: jest.fn().mockReturnValueOnce("abc"),
},
});
也就是getAuth
将返回一个currentUser
对象,在currentUser
对象中有一个getIdToken
函数将返回"abc"作为价值。
然后在我的实际代码文件中"像这样调用:
const firebaseToken = getAuth().currentUser?.getIdToken();
但是在"测试文件"中收到的firebaseToken
的值将是abc
,因为我们已经模拟了上面的值。在测试文件中,它不会调用实际的Firebase方法,而是调用我上面模拟的方法并获得值。