Тест на реакцию создателя асинхронного действия - неопределенные данные - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть следующее действие и контрольный пример - когда я запускаю этот тест (шут) - я вижу TypeError: Невозможно прочитать свойство 'data' undefined в создателе действия, не знаете, чего здесь не хватает?Я предоставляю mockData, что ожидается.это потому что здесь есть асинхронность?но я использую `.then, но все равно не получается.

Action creator:

    export const getUser = ({
      uname,
      apiendpoint,
    }) => {
      const arguments = {};


      return async (dispatch) => {
        await axiosHelper({ ---> this will return axios.get
          arguments,
          path: `${apiendpoint}/${uname}`,
          dispatch,
        }).then(async ({ data, headers }) => { -- getting error at this line.
          dispatch({ type: GET_USER, payload: data });
          dispatch({ type: GET_NUMBEROFUSERS, payload: headers });
        });
      };
    };

Test:

    describe('Get User Action', () => {
      let store;
      const middlewares = [thunk];
      const mockStore = configureStore(middlewares);
      beforeEach(() => {
        store = mockStore({
          data: [],
        });
      });

      afterEach(() => {
        fetchMock.reset();
        fetchMock.restore();
      })

       const arguments = {
        uname: 'user123',
        apiendpoint: 'test',
      };
      const url = 'https://www.localhost.com/blah/blah';

      it('should get a User', () => {
        fetchMock
          .getOnce(url, {
            data: mockData, -->external mock js file with user data {}
            headers: {
              'content-type': 'application/json'
            }
          });

        const expectedActions = [
          {
            type: 'GET_USER',
            data: mockData
          },
          { type: 'GET_NUMBEROFUSERS' }
        ];


        return store.dispatch(actions.getUser(arguments)).then(() => {
          expect(store.getActions()).toEqual(expectedActions);
        });

      });

1 Ответ

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

Вы используете await И then для одной и той же функции (например, axiosHelper).

Это неправильное использование и приведет ко многим ошибкам undefined.Вы либо используете функцию обратного вызова или a .then() или await, но не 2 или все из них.

Я рекомендую посмотреть некоторые уроки /объяснения об асинхронности / ожидании, потому что очень важно понять, что такое Обещание.

То, что происходит в вашем cas, заключается в том, что axiosHelper выполняется 2 раза, потому что если он закончится, то часть then сработаетно в то же самое время (потому что это асинхронно) await завершается, и выполнение кода продолжает родительский поток.Это поднимает условия гонки и, как я уже сказал, приведет к undefined, потому что вы выполняете одну и ту же логику дважды или более.

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