2017-05-15 3 views
1

J'essaie d'ajouter des cas de test unitaires à mes actions de redux.Tests unitaires Redux async actions

J'ai essayé this, this & this

J'utilise thunk, promise-middleware dans mes actions

une de mon action est comme ce

export function deleteCommand(id) { 
    return (dispatch) => { 
    dispatch({ 
     type: 'DELETE_COMMAND', 
     payload: axios.post(`${Config.apiUrl}delete`, { _id: id }) 
    }) 
    } 
} 
test unitaire

pour cela est

import configureMockStore from "redux-mock-store" 
const middlewares = [thunk, promiseMiddleware()]; 
const mockStore = configureMockStore(middlewares) 

    it('creates DELETE_COMMAND_FULFILLED after deleting entry', (done) => { 

    nock('http://localhost:8081/') 
     .post('/delete',{ 
     _id: 1 
     }) 
     .reply(200, {}) 

    const expectedActions = [{ 
     type: 'DELETE_COMMAND_FULFILLED', 
     payload: {} 
    }] 

    const store = mockStore({ 
     command: { 
     commands: [] 
     } 
    }) 

    store.dispatch(actions.deleteCommand({_id: 1}).then(function() { 
     expect(store.getActions()) 
     .toEqual(expectedActions) 
     done(); 
    }) 

    }) 

J'utilise nock, redux-mock-store configuré avec thunk, promise middleware

Il donne then of undefined

puis j'ai changé l'action de retourner la promesse, je suis unhandled promise reject exception, j'ai ajouté une prise à l'appel d'expédition d'action . Maintenant, je reçois Network Error parce que nock ne se moque pas de l'appel. Également essayé moxios, modifié axios à isomorphic-fetch, whatwg-fetch. Ne semble pas fonctionner

Où est-ce que je fais mal?

+0

Configurez-vous votre magasin de données correctement? c'est-à-dire ajouter le thunk et promettre le middleware. – Nick

+0

J'ai mis à jour ma question avec le magasin de simulation ainsi – Sreevisakh

Répondre

0

Comme il s'agit d'une action asynchrone, vous devez envoyer une action réussie lorsque la promesse de requête post axios est résolue avec succès.

Vous devez renvoyer la promesse retournée en appelant axios.post afin que vous puissiez effectuer l'assertion asynchrone dans votre test.

export function deleteCommand(id) { 
    return (dispatch) => { 
    dispatch({ type:'DELETE_COMMAND_POSTED' }) 

    return axios.post(`${Config.apiUrl}delete`, { _id: id }) 
     .then((res) => { 
     dispatch({ type: 'DELETE_SUCCESSFUL', payload: res }) 
     }) 
    } 
} 
+0

J'utilise le middleware de la promesse. Si la charge utile est une promesse, elle déclenche automatiquement trois actions, 'DELETE_COMMAND_PENDING',' DELETE_COMAMND_FULFILLED', 'DELETE_COMMAND_REJECTED'. Dans mon réducteur, je gère ces actions. Donc, il semble plus propre dans le fichier d'actions. Un moyen de le tester tel quel? – Sreevisakh

+0

Vous testeriez que les actions correctes sont expédiées dans votre magasin virtuel sous certaines conditions. Par exemple, vous utiliseriez nock pour donner une erreur et ensuite affirmer que les actions PENDING et REJECTED ont toutes deux été envoyées au magasin. – therewillbecode