Почему я не могу отправить действие, когда обещание разрешается внутри промежуточного программного обеспечения Redux?

Фон

Я пишу часть промежуточного программного обеспечения Redux, которое делает запрос axios и использует Cheerio для анализа результата.

Проблема

Когда обещание Axios разрешается, и я пытаюсь отправить выполненное действие, действие не отображается в журнале действий магазина в тесте.

Промежуточное ПО

function createMiddleware() {
    return ({ dispatch, getState }) => next => action => {

      if (isCorrectAction(action)===true){

      const pendingAction = {
        type: `${action.type}_PENDING`,
        payload: action.payload
      }

      dispatch(pendingAction)

      axios.get(action.payload.url)
            .then(response => {
              let $ = cheerio.load(response.data)
              let parsedData = action.payload.task($)

              const fulfilledAction = {
                type: `${action.type}_FULFILLED`, 
                payload: { 
                  parsedData 
                }
              }

              dispatch(fulfilledAction) // dispatch that is problematic

            })
            .catch( err => {

            });
       }

        return next(action);
    }
}

Проверка отправки выполненного действия завершается неудачно

   it('should dispatch ACTION_FULFILLED once', () => {
       nock("http://www.example.com")
           .filteringPath(function(path) {
               return '/';
           })
           .get("/")
           .reply(200, '<!doctype html><html><body><div>text</div></body></html>');

       const expectedActionTypes = ['TASK', 'TASK_PENDING', 'TASK_FULFILLED']

       // Initialize mockstore with empty state
       const initialState = {}
       const store = mockStore(initialState)
       store.dispatch(defaultAction)

       const actionsTypes = store.getActions().map(e => e.type)
       expect(actionsTypes).has.members(expectedActionTypes);
       expect(actionsTypes.length).equal(3);
   });

person therewillbecode    schedule 06.01.2017    source источник


Ответы (1)


Решение. В тесте мокко необходимо вернуть Promise

Решение состоит в том, чтобы переписать тест мокко, чтобы возвращалось обещание. Я ошибочно подумал, что при использовании nock для перехвата HTTP-запроса обещание станет синхронным.

Рабочий тест выглядит так:

it('should dispatch ACTION_FULFILLED once', () => {
    nock("http://www.example.com")
        .filteringPath(function(path) {
            return '/';
        })
        .get("/")
        .reply(200, '<!doctype html><html><body><div>text</div></body></html>');

    const store = mockStore();

    return store.dispatch(defaultScrapingAction)
                .then(res => {   

         const actionsTypes = store.getActions().map(e => e.type)
         expect(actionsTypes).has.members(expectedActionTypes);
         expect(actionsTypes.length).equal(3);
    })
});
person therewillbecode    schedule 08.01.2017