redux-mock-store getActions返回空数组

时间:2017-02-12 07:51:34

标签: javascript reactjs redux nock redux-mock-store

这是我的行动创作者:

export function signinUser({login, password}){  

    return function(dispatch){      
        axios.post('/auth/signin', {login, password})
            .then((response)=>{             
                //-update state to indicate user is authenticated
                var {username, userid, token} = response.data;
                dispatch(authUser(token, username, userid));                
                console.log(1)
            })
            .catch(()=>{
                //- show error message
                dispatch(setErrorMessage('Bad Login Info'));                                
                console.log(2)
            });
    }   
}

测试:

 describe('signinUser', ()=>{

    var {signinUser} = actions;
    var arg;

    beforeEach(() => {
        arg = {
            login: 'john',
            password: '123'
        }           
    });

    afterEach(function () {
        nock.cleanAll()
    });

    it('should call setErrorMessage', ()=>{     

        nock('http://localhost:5000/auth/signin').post('')              
            .reply(401)         

        var expectedActions = [
            {
                type: 'SET_ERROR',
                payload: 'Bad Login Info'
            }
        ];

        var store = mockStore({});          
        store.dispatch(signinUser({...arg}));
        expect(store.getActions()).to.equal(expectedActions)
    });    

输出结果为:

2
AssertionError: expected [] to equal [ Array(1) ]

这意味着 - 已经调用了动作创建者 - 并且已经调用了catch中的console.log(2)! 但不知怎的,getActions返回一个空数组。 请帮我弄清楚原因。

2 个答案:

答案 0 :(得分:1)

好的问题是:我没有在动作创建者中回复承诺。 以下是我的动作创建者的更新版本:

export function signinUser({login, password}){  
    //you have to return this one
    return function(dispatch){      
        return axios.post('/auth/signin', {login, password})
            .then((response)=>{             
                //-update state to indicate user is authenticated
                var {username, userid, token} = response.data;
                dispatch(authUser(token, username, userid));                
                console.log(1)
            })
            .catch(()=>{
                //- show error message
                dispatch(setErrorMessage('Bad Login Info'));                                
                console.log(2)
            });
    }   
}

答案 1 :(得分:0)

是的,我也面临着同样的问题。我所有的动作创建者都是以这种形式编写的,而一个动作创建者则不是那种返回格式。我为此浪费了2天。 最终,我重组了动作创建者,它运行正常。