Как протестировать функцию в хуке React, но эта внутренняя функция возвращается на основе вывода обещания

У меня есть хук, который я хочу протестировать и который выглядит примерно так:

export useFunc(){
  const func = async () => {
    const [result, otherStuff] = await Promise.all([getSomeData(), someOtherStuff()])
      
    if (!result){
       return; // I NEED TO TEST THIS
    }
    return result;
  }
  return { func };
}

Тест устроен так:

it("whatever description", () => {

  const { result } = renderHook(() => useFunc());
  const { func } = result.current;
  
  // I need to somehow test that the return gets hit inside `func`!
  
});

Как мне протестировать этот оператор возврата?

Импортируется ли внутренняя функция в этот модуль?

Harry 03.02.2023 23:18

Он не импортируется, я забыл упомянуть, что тестирую здесь хук. Будет обновляться! Спасибо @Гарри!

D00dood 03.02.2023 23:23

Просто вызовите func из теста и убедитесь, что вы получили нуль или что-то в этом роде. Также вы не ждете Promise.all, поэтому тест всегда будет возвращать значение null. Я бы сказал: напишите тест для случая успеха, пройдите его. После прохождения второй тест должен утверждать, что возвращаемое значение пусто. Если это не так, вы знаете, что не попали в свой блок if

Tom 03.02.2023 23:40

Ой, пропустил ожидание на Promise.all, когда я скопировал это, просто обновил! Спасибо, что поймали это! Попробую, спасибо @Tom

D00dood 03.02.2023 23:48

Что возвращает getSomeData? Кроме того, почему вы используете Promise.all, если у вас есть только одна вещь, которую вы ждете? Просто ждать этого? const result = await getSomeData();.

Mike 'Pomax' Kamermans 04.02.2023 00:38
getSomeData в этом случае просто возвращает словарь, но я считаю, что могу издеваться над любым ложным значением. Обновлен код, чтобы отразить, что я на самом деле использую Promise.all и для других вещей. Спасибо!
D00dood 04.02.2023 00:41

объект, а не словарь

D00dood 04.02.2023 00:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
7
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо, что-то вроде этого работает, так же просто, как просто вызвать функцию, как упомянул Том!

it("whatever description", async () => {
  mockGetSomeData.mockResolvedValueOnce(undefined) // just need to make sure this is mocked properly
  const { result } = renderHook(() => useFunc());
  const { func } = result.current;
  
  const returnedValue = await func();
  
  expect(returnedValue).toBe(undefined);
});

Другие вопросы по теме

Похожие вопросы