2017-01-27 1 views
4

Я пытаюсь проверить свои асинхронные действия при сокращении, но я не получаю его.Нок, не работающий с аксиомами, получает в действии асинхронный тест

Я использую Нок и AXIOS, так что я пытаюсь получить данные Отвечает от Аксиос получить, чтобы проверить мои действия:

describe('Async Actions',() => { 
    afterEach(() => { 
     nock.cleanAll(); 
    }); 

    it('should load transmissors', (done) => { 
     const localStorage = { 
      token: 'a9sd8f9asdfiasdf' 
     }; 
     nock('https://tenant.contactto.care') 
       .get('/api/clients/1/transmissors/', { 
        reqheaders: { 'Authorization': "Token " + localStorage.token } 
       }) 
       .reply(200, { data: [ 
        { 
         "id": 12, 
         "zone": "013", 
         "client": 1, 
         "description": "pingente", 
         "identifier": "", 
         "general_info": "" 
        }, 
        { 
         "id": 15, 
         "zone": "034", 
         "client": 1, 
         "description": "colar", 
         "identifier": "", 
         "general_info": "" 
        } 
       ]}); 

     axios.get(`/api/clients/1/transmissors/`, { 
      headers: { 'Authorization': "Token " + localStorage.token }, 
     }).then(transmissors => { 
       console.log(transmissors); 
     }).catch(error => { 
      throw(error); 
     }) 
     done(); 
    }); 
}); 

и вот мое действие:

export function loadTransmissors(clientId){ 
     return function(dispatch){ 
      axios.get(`/api/clients/${clientId}/transmissors/`, { 
       headers: { 'Authorization': "Token " + localStorage.token }, 
      }).then(transmissors => { 
        dispatch(loadTransmissorsSuccess(transmissors.data, clientId)); 
      }).catch(error => { 
       throw(error); 
      }) 
     } 
    } 

Но я эта ошибка в console.log:

UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): SyntaxError 

Я нашел ответ от Дэна Абрамова: How to unit test async Redux actions to mock ajax response

https://github.com/reactjs/redux/issues/1716

Кто-нибудь знает, как сделать тест с Redux-thunk.withExtraArgument?

Заранее спасибо.

+0

в том, что полное сообщение об ошибке? – gfullam

+0

Я бы предложил axios-mock-adapter для этого https://www.npmjs.com/package/axios-mock-adapter – Samo

ответ

0

я решил мою проблему инъекционного AXIOS с помощью аргумента в Redux стуком https://github.com/gaearon/redux-thunk#injecting-a-custom-argument

Так что я изменил мой перевождь санк в моем магазине:

applyMiddleware(thunk) 

для

applyMiddleware(thunk.withExtraArgument({ axios })) 

Так что я обновил свой асинхронные возвратные функции при действиях От:

return (dispatch) => { 
    ... 
} 

To:

return (dispatch, getState, { axios }) => { 
    ... 
} 

в моем actions.test я издевался АНИ с обещаниями:

const axios = { 
     get: (url,params) => Promise.resolve({data: transmissors}) 
} 

впрыскивается в Redux стуком:

const middleware = [thunk.withExtraArgument({axios})]; 
    const mockStore = configureMockStore(middleware); 

    function asyncActions() { 
     return dispatch => { 
     return Promise.resolve() 
      .then(() => dispatch(transmissorsActions.loadTransmissors(1))) 
     } 
    } 

и я использовал функцию asyncActions для проверки моих действий в моем магазине:

it('should load transmissors', (done) => { 
     const expectedAction = { type: types.LOAD_TRANSMISSORS_SUCCESS, transmissors, clientId}; 

     const store = mockStore({transmissors: [], expectedAction}); 
     store.dispatch(asyncActions()).then(() => { 
      const action = store.getActions(); 
      expect(action[0].type).equal(types.LOAD_TRANSMISSORS_SUCCESS); 
      expect(action[0].transmissors).eql(transmissors); 
      expect(action[0].clientId).equal(1); 
     }); 
     done(); 

    }); 

Вы можете получить больше информации о Redux-макете магазина с этим образцом: https://github.com/arnaudbenard/redux-mock-store/blob/master/test/index.js

Смежные вопросы