Шутка, как издеваться над функцией внутри объекта?

# #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, вместо этого он вызовет метод, над которым я издевался выше, и вернет значение.