Реактивный и шуточный модуль

Я создаю приложение , в котором я использую перевождь и node- его ( «следовало назвать метод выборки с URL постоянной» , () => { сопз шпионский = жасмин . CreateSpy ( «nodeFetch» ); шпион . И . CallFake ( () => new Promise ( resolve => resolve ( 'null' ))); const mock = jest . mock ( 'node-fetch' , spy ); const slug = 'slug' ; actionHandler [ FETCH_REMOTE ] ( slug ); ожидать ( шпион ). toHaveBeenCalledWith ( константы . URL + slug ); }); для удаленной выборки данных.

Я хочу проверить, что я хорошо называю функцию выборки хорошим параметром.

Таким образом, я использую методы jest.mock и jasmine.createSpy:

[FETCH_REMOTE]: slug => {
        return async dispatch => {
            dispatch(loading());
            console.log(fetch()); // Displays the default fetch promise result
            await fetch(Constants.URL + slug);
            addLocal();
        };
    }

Вот функция, которую я пытаюсь проверить:

actionHandler[FETCH_REMOTE]

Как вы можете видеть, я пытаюсь зарегистрировать поведение отправки (fetch ()), и у меня есть обещание по умолчанию разрешить заданное методом node-fetch, а не то, что я издеваюсь над Jest и шпионил за жасмином.

У вас есть идея, что это не работает?

EDIT: мой тест показал мне ошибку, как мой шпион никогда не назывался

javascript,unit-testing,reactjs,jasmine,jestjs,

0

Ответов: 1


1 принят

Ваш диспетчер-обработчик фактически является фабрикой обработчика действий. В , вы создаете новую функцию. Возвращенные функции задают как параметр и вызывают код, который вы показываете. Это означает, что ваш тестовый код никогда не вызовет каких-либо функций шпиона, поскольку созданная функция никогда не вызывается. let dispatchMock = jest.fn(); // create a mock function actionHandler[FETCH_REMOTE](slug)(dispatchMock);actionHandler

Я думаю, вам нужно будет создать функцию mock actionCreatorи сделать что-то вроде этого:

actionFactories

РЕДАКТИРОВАТЬ:

Для меня ваш thunksвзгляд больше похож на actionCreater, как его обычно называют в терминах redux, хотя я лично предпочитаю их называть, actionHandlerпотому что это они: фабрики, которые создают действия.
Когда вы используете action(?) Ваш (который вводит в заблуждение ) не создает напрямую, а выполняет другую функцию, которая вызывается, как только будет отправлено действие. Для сравнения, регулярный actionCreator выглядит следующим образом:updateFilter: (filter) => ({type: actionNames.UPDATE_FILTER, payload: {filter: filter}}),actionHandleraction

actionFactories

А, с другой стороны, реагирует на отправленные действия и оценивает их полезную нагрузку. const actionFactories = { fetchRemote(slug): (slug) => { return async dispatch => { dispatch(loading()); console.log(fetch()); // Displays the default fetch promise result let response = await fetch(Constants.URL + slug); var responseAction; if (/* determine success of response */) { responseAction = actionFactories.fetchSuccessful(response); } else { responseAction = actionFactories.fetchFailed(); } dispatch(responseAction); }; } fetchFailed(): () => ({type: FETCH_FAILED, }), fetchSuccessful(response): () => ({type: FETCH_FAILED, payload: response }) };

Вот что я сделал бы в вашем случае:

Создайте новый объект, названный FETCH_FAILEDтак:

FETCH_SUCCESSFUL

Создайте actionHandler console.logи fetchобновите хранилище на основе ответа.

BTW: Ваше console.logзаявление не имеет особого значения для меня, поскольку fetchпросто возвращает обещание.

JavaScript, блок-тестирование, reactjs, жасмин, jestjs,
Похожие вопросы