#javascript #reactjs #unit-testing #jestjs #redux-saga
Вопрос:
Поэтому я пытаюсь высмеять call
функцию с redux-saga/effects
помощью jest, и, похоже, она выдает сообщение об ошибке call is not declared configurable
.
import * as mockreduxSagaEffects from 'redux-saga/effects';
test('calls all the appropriate actions', async () => {
const dispatchedActions = [];
jest.spyOn(mockreduxSagaEffects, 'call', 'get').mockImplementationOnce(() => someData);
});
Что я делаю не так?
Ответ №1:
Тестирование redux-saga обычными средствами-довольно неприятное дело. Вам следует использовать redux-saga-test-plan, я настоятельно рекомендую его, он очень хорош
Итак, я не вижу саги, которую вы хотите протестировать, но, видя, что вы хотите издеваться .call (), давайте возьмем ее в качестве примера. Я думаю, что если вы поймете это, у вас не возникнет проблем с пониманием других функций redux-saga.
function* userSaga(api) {
const user = yield call(api.fetchUser, action.payload);
yield put({
type: 'RECEIVE_USER',
payload: { user, pet },
});
}
it('fetches the user', () => {
const fakeUser = { name: 'Jeremy', petId: 20 };
const fakeDog = { name: 'Tucker' };
return expectSaga(userSaga, api)
.provide([
[call(api.fetchUser, 42), fakeUser],
])
.put({
type: 'RECEIVE_USER',
payload: { user: fakeUser, pet: fakeDog },
})
.run();
});
Обратите внимание, как мы передаем массив с вызовом, который мы хотим смоделировать, и результатом, который мы хотим имитировать. Вы также можете сделать это с помощью select.
Put также очень интуитивно понятен, ваш тест будет ожидать, что сага запустит это действие.
Есть и другие вещи, которые действительно полезны, такие как
.withReducer(reducer)
.hasFinalState({
name: 'Tucker',
age: 12,
})
Таким образом, вы устанавливаете редуктор с начальным состоянием по вашему выбору. После того, как все эффекты будут запущены в соответствии с вашими требованиями к тестированию, redux-saga-test-plan проверит, изменился ли редуктор соответствующим образом.