Как написать JEST-тесты для API обратного вызова - PullRequest
0 голосов
/ 28 декабря 2018

Я создал фабрику сервисов API, передавая динамически URL, функцию в качестве параметра.Как только данные об успехе поступают в функцию обратного вызова и все работает нормально, как и ожидалось.Для этого же я собираюсь написать тестовые примеры JEST. Я не мог найти правильный подход, чтобы сделать это .Может помочь кому-то.Очень ценю.

Код здесь

function userLogin(username, password) {
  const reqBody = {
    companyEmailAddress: username,
    password,
  };
  const url = `${config.apiBaseUrl}${serviceMethodConstants.login}`;
  return (dispatch) => {
    dispatch(serviceFactory.postData(url, false, reqBody, function (response, dispatch) {
      if (response !== undefined) {
        console.log(response )
      }
    }));
  };
}

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

JEST тестовый код

import { userConstants } from './constants';
import { serviceFactory } from '../../services/_helpers/serviceFactory';

const loginData = {
  companyEmailAddress: 'rameshffdfdf.lambanihghgh@gmail.com',
  password: 'Ramesh@1',
};

axiosMock.onPost(routeUrl).reply(200, JSON.stringify(loginData));
const spy = jest.spyOn(axios, 'post');
await store.dispatch(userActions.userLogin(...loginData, function (response, dispatch) {
    expect(response.message).toEqual('Failure');
    expect(spy).toBeCalled();
}));

enter image description here enter image description here

1 Ответ

0 голосов
/ 28 декабря 2018

userLogin Создатель действия (Thunk) не принимает обратный вызов и не выполняет запрос.Неизвестно, вернет ли store.dispatch обещание, которое можно было бы ожидать.

Правильная стратегия для юнит-тестирования - это издеваться над всем, кроме тестируемого юнита.Поскольку используется serviceFactory абстракция, Axios не должен участвовать.Создатель действий может быть протестирован без участия Redux.

const dispatch = jest.fn();
const postDataResult = {};
jest.spyOn(serviceFactory, 'postData').mockReturnValue(postDataResult);

userActions.userLogin('user', 'pass')(dispatch);

expect(serviceFactory.postData).toBeCalledWith(url, false, {...}, expect.any(Function));
expect(dispatch).toBeCalledWith(postDataResult);

Таким образом, тест может оставаться синхронным.

...