Шутка - как проверить результат обещания

Используя Jest, как я могу проверить шаги, выполняемые при разрешении обещания в функции под модульным тестом?

Пример:

// FUNCTION TO TEST
export function functionToTest(url) {
  initSomething().then(() => {
    console.info('YEP, CALLED');
    storeHistory.push(url);
  });
}

// UNIT TEST
import { functionToTest, __RewireAPI__ as rewireUtility } from './funcToTest';

describe('functionToTest', () => {
  let pushSpy;
  beforeEach(() => {
    pushSpy = jest.fn();
    rewireUtility.__set__('storeHistory', { push: pushSpy });
    rewireUtility.__set__('initSomething', () => Promise.resolve());
  });

  it('pushes the given url to history after initializing cordova', () => {
    functionToTest('/sports');
    expect(pushSpy).toHaveBeenCalledTimes(1);
    expect(pushSpy).toHaveBeenCalledWith('/sports');
  });
});

В этом случае pushSpy вызывается 0 раз (даже если журнал распечатывается). Как я могу правильно проверить это?

во-первых, ваш functionToTest не возвращает обещание, поэтому await нечего ждать, поэтому он не будет.

lecstor 13.03.2019 11:29

Хорошо, я пробовал этот маршрут. Тот же результат, удаляя его.

Gabe 13.03.2019 11:30

простите, что удалить? ~удалено~ нет, мой плохой

lecstor 13.03.2019 11:33

Я был бы склонен отказаться от использования rewire самостоятельно. Вы должны иметь возможность jest.mock initSomething, но это вряд ли что-то решит.

lecstor 13.03.2019 11:36

Если я использую следующее, время ожидания истекает.. global.history = { push: (route) => { expect(route).ToEqual('/sports'); done(); }}; (но вызывается console.info..)

Gabe 13.03.2019 11:38

Аргх, тупой я. Это история магазина не window.history, ее не правильно смоделировали.

Gabe 13.03.2019 11:48

круто, я пытался разобраться, что это за история.. 8) ..также, вместо удаления await нужно return initSomething().then(()... и сделать тест асинхронным, т.е. describe('functionToTest', async () => {

lecstor 13.03.2019 11:51

Еще не решил, даже издевался над правильным объектом истории. Вопрос обновлен.

Gabe 13.03.2019 11:53
Поведение ключевого слова "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
8
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Решено с помощью этого:

it.only('pushes the given url to history after initializing cordova', (done) => {
  rewireUtility.__Rewire__('history', { push: (route) => {
        expect(route).toEqual('/sports');
        done();
  } });
  functionToTest('test://sports');
});

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