笑话,如何模拟一个对象内的函数?



我有一个函数,将调用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对象的方法。

currentUserAuth对象的属性,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方法,而是调用我上面模拟的方法并获得值。

相关内容

  • 没有找到相关文章

最新更新