Тестирование действия Redux, которое отправляет 2 другие функции с Jest? - PullRequest
1 голос
/ 09 мая 2019

У меня есть функция (действие Redux), которая вызывает 2 функции.Я не могу понять, как это проверить с помощью Jest:

Это моя функция:

import doSomething from 'redux/do-something';
import doSomethingElse from 'redux/do-something-else';

export default () => async dispatch => {
  await dispatch(doSomething());
  dispatch(doSomethingElse());
};

Это мой тест:

import doSomething from 'redux/do-something';
import doSomethingElse from 'redux/do-something-else';

import functionToTest from 'redux/function-to-test'

describe("functionToTest", ()=>{
    jest.mock('redux/do-something');
    jest.mock('redux/do-something-else');
    const dispatch = jest.fn();

    test('my test', ()=>{
        functionToTest()(dispatch);
        console.log(dispatch.mock.calls); // This returns an anonymous function
        console.log(doSomething) // This returns undefined 
    })

})

1 Ответ

2 голосов
/ 09 мая 2019

Похоже, вы хотите смоделировать экспорт по умолчанию для do-something и do-something-else и проверить, что они отправляются тестируемым кодом.

Если это так, то вы можете сделать это так:

import functionToTest from 'redux/function-to-test'

jest.mock('redux/do-something', () =>
  () => 'do something mock'
);
jest.mock('redux/do-something-else', () =>
  () => 'do something else mock'
);

describe("functionToTest", () => {
  test('my test', async () => {  // <= async test function
    const dispatch = jest.fn();
    await functionToTest()(dispatch);  // <= await the Promise
    expect(dispatch.mock.calls[0][0]).toBe('do something mock');  // Success!
    expect(dispatch.mock.calls[1][0]).toBe('do something else mock');  // Success!
  });
});

Детали

Вы можете передать фабричную функцию модуля в качестве второго параметра в jest.mock, а Jest будет использовать результат вызова функции в качестве результата, возвращаемого при импорте модуля во время теста.

jest.mock вызовы поднимаются на babel-jest и выполняются до всего остального в файле кода. Подъем работает неправильно, если в тестовой функции определено jest.mock, поэтому вызовы jest.mock должны быть перемещены в область верхнего уровня тестового файла.

Тестируемая функция - async, поэтому используйте async тестовую функцию и await Promise, чтобы убедиться, что она завершилась до подтверждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...