Jest asyn c action создатели: TypeError: Невозможно прочитать свойство 'then' из неопределенного - PullRequest
0 голосов
/ 27 марта 2020

Вроде новичок ie, чтобы пошутить здесь. Я пытаюсь написать юнит-тесты для одного из создателей асин c действий в моем проекте React, используя jest. Я продолжаю сталкиваться с ошибкой TypeError: Невозможно прочитать свойство 'then' из неопределенного

Ниже представлен мой создатель действий:

import {loginService} from "./services";

export function login(email: string, password: string): (dispatch: ThunkDispatch<{}, {}, any>) => void {
  return dispatch => {
    dispatch(loggingIn(true));
    loginService(email, password).then(
      (response: any) => {
        dispatch(loggingIn(false));
        dispatch(loginAction(response));
      },
      error => {
       //Code
        }
        dispatch(loggingIn(false));
        dispatch(loginError(true, message));
      }
    );
  };
}

. / Services. js

export const loginService = (username: string, password: string) => {
  const requestOptions = {
    method: "POST",
    headers: {
      //Headers
    },
    body: JSON.stringify({email: username, password: password})
  };
  return fetch(`url`, requestOptions)
    .then(handleResponse, handleError)
    .then((user: any) => {
      //code
      return user;
    });
};

Ниже приведен мой тест:

it("login", () => {
    fetchMock
      .postOnce("/users/auth", {
        body: JSON.parse('{"email": "user", "password": "password"}'),
        headers: {"content-type": "application/json"}
      })
      .catch(() => {});
    const loginPayload = {email: "user", password: "password"};
    const expectedSuccessActions = [
      {type: types.LOGGING_IN, payload: true},
      {type: types.LOGIN, loginPayload}
    ];
    const expectedFailureActions = [
      {type: types.LOGGING_IN, payload: true},
      {type: types.LOGIN_ERROR, payload: {val: true, errorMessage: "error"}}
    ];
    const store = mockStore({user: {}});
    const loginService = jest.fn();
    return store.dispatch(LoginActions.login("email", "password")).then(() => {
      expect(store.getActions()).toEqual(expectedSuccessActions);
    });
  });

Пожалуйста, помогите

1 Ответ

0 голосов
/ 28 марта 2020

Конечный результат, возвращаемый при отправке вашего действия LoginActions.login(), равен void (или undefined). Не Promise, поэтому вы не можете назвать .then() в своем тесте.

Судя по вашему тестовому коду, вы используете fetch-mock для fetchMock. Вы должны быть в состоянии дождаться, пока это закончится sh, прежде чем проверять, что магазин отправил правильные действия:

it("login", async () => {
//          ^^^^^ --> note that you need to make your test async to use await

    store.dispatch(LoginActions.login("email", "password"));
    await fetchMock.flush();

    expect(store.getActions()).toEqual(expectedSuccessActions);
});

Обратите внимание, что комментарии в вашем коде, кажется, указывают, что ваш loginService делает еще кое-что, прежде чем вернуться из обратного вызова .then(). Если это занимает слишком много времени, ожидание окончания fetchMock до sh может не длиться достаточно долго. В этом случае вам следует рассмотреть возможность возврата Promise из вашего действия LoginActions.login(), чтобы вы могли проверить его. То, стоит ли вам , зависит от того, сколько усилий потребуется для настройки вашего приложения, чтобы справиться с этим, поскольку вы не хотите, чтобы ваше приложение обрабатывало sh с любыми необработанными ошибками отклонения обещания в случае входа в систему. терпит неудачу.

...