# #reactjs #unit-testing #firebase-authentication #jestjs
Вопрос:
У меня есть функция, которая вызовет 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()
это метод, который вернет Auth
объект из Firebase.
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.log: Не удается прочитать свойство «Текущий пользователь» неопределенного
В нем говорится, что currentUser
это не определено. Но так как я mockResolvedValueOnce
в начале теста, но он все еще не может получить currentUser
значение.
Вопрос
Как я могу издеваться над этой функцией? И что я делаю не так?
const firebaseToken = getAuth().currentUser?.getIdToken();
Ответ №1:
Это сработало для меня:
const getAuth = jest.fn(() => ({
currentUser: {
getIdToken: () => 32,
}
}));
Ответ №2:
В конечном итоге я издеваюсь над этим вот так:
(getAuth as jest.Mock).mockReturnValue({
currentUser: {
getIdToken: jest.fn().mockReturnValueOnce("abc"),
},
});
Который getAuth
вернет currentUser
объект, внутри currentUser
объекта есть getIdToken
функция, которая вернет «abc» в качестве значения.
Затем, когда «в моем реальном файле кода» вызывается так:
const firebaseToken = getAuth().currentUser?.getIdToken();
Но значение firebaseToken
, полученное в «Тестовом файле», будет abc
, так как мы уже высмеиваем значение выше. В тестовом файле он не будет вызывать фактический метод Firebase, вместо этого он вызовет метод, над которым я издевался выше, и вернет значение.