Я получаю TypeError: Невозможно прочитать свойство 'then' из undefined при попытке проверить асинхронное действие

У меня проблема с тестированием моего асинхронного действия в ReactionJS. Вот мой код:

export function fillStoryBoard(snippetsLink, channel, uniqueStoryObj, isUniqueStorySearch) {

return function(dispatch){
        for (var i = 0; i < snippetsLink.length; i++) {
            loadStorySnippet(channel, snippetsLink[i], (i + 1),dispatch);
        }
    }
 }

function loadStorySnippet(channel,snippetsLink,indexValue,dispatch){
    return axios.get(ServiceUrls.prototype.getServicesDfltUrl()+snippetsLink)
        .then(response => {
            dispatch({
                type: "FILL_STORYBOARDS",
                payload: {
                    "channelName": channel,
                    "storiesSnippet": response.data,
                    "order":indexValue
                }
            });
        }).catch(function(response){

    });
 }

Так что мой вызов asnc находится в функции, которая не экспортируется, и есть функция, вызывающая эту функцию asnc в цикле for.

Теперь вот мой тест:

it('should dispatch type: FILL_STORYBOARDS with what is returned from server as a payload', () => {
    nock(ServiceUrls.prototype.getServicesDfltUrl())
        .get('/snippet/111')
        .reply(200, {"id":1,"headline":"",
            "label":"Other",
            "imgUrl":"",
            "postDate":0});


    const expectedActions = [
        { "type": "FILL_STORYBOARDS","payload": { "channel": "",
            "storiesSnippet": {"id":1,"headline":"",
                "label":"Other","imgUrl":"" +
                "",
                "postDate":0},
            "order":1 } }
    ]
    const store = mockStore();
    return store.dispatch(fillStoryBoard(["snippet/111"], "")).then(() => {
        expect(store.getActions()[0].type).to.equal(expectedActions[0].type);
    })
})

Теперь проблема в том, что при запуске теста я получаю:

TypeError: Cannot read property 'then' of undefined

Любая идея, как я могу это исправить?

1 ответ

Решение

Функция thunk, возвращаемая fillStoryBoard не возвращает обещание, поэтому вы не можете .then от этого.

Попробуйте что-то вроде этого:

return function(dispatch){
  var promises = [];
  for (var i = 0; i < snippetsLink.length; i++) {
      promises.push(loadStorySnippet(channel, snippetsLink[i], (i + 1),dispatch));
  }
  return Promise.all(promises);
}

РЕДАКТИРОВАТЬ:

Если петли нет, то вы можете просто сделать это:

return function(dispatch){
    return loadStorySnippet(...your arguments here, dispatch));
}
Другие вопросы по тегам