2017-05-24 67 views
1

进口我有一个小redux中间件,像这样如何嘲弄与开玩笑

import { hashHistory } from 'react-router' 
import { REDIRECT_TO_LOGIN_REDIRECT_URL } from '../actions/login-redirect'; 

export default store => next => action => { 

    if (action.type === REDIRECT_TO_LOGIN_REDIRECT_URL) { 
     hashHistory.push(store.getState().loginRedirectUrl); 
    } 

    return next(action) 
} 

,我现在想测试一下。正如您在第1行中看到的,我正在导入hashHistory并稍后使用它。这是我想测试的(致电hashHistory)。要做到这一点,我不得不模仿hashHistory,但我不知道如何。我使用jest

import { REDIRECT_TO_LOGIN_REDIRECT_URL } from '../actions/login-redirect'; 
import redirectMiddleware from './redirect-after-login'; 

describe('redirect after login middleware',() => { 

    function setup() { 
     const store = { 
      subscribe:() => {}, 
      dispatch:() => {}, 
      getState:() => ({}) 
     }; 
     const next = jest.fn(); 
     const action = { type: REDIRECT_TO_LOGIN_REDIRECT_URL }; 
     return { store, next, action }; 
    } 

    it('should push the redirect URL to the hashHistory',() => { 
     // How to test it? 
    }) 

}); 

回答

4

你可以嘲笑react-router模块是这样的:

import { hashHistory } from 'react-router' 
import { REDIRECT_TO_LOGIN_REDIRECT_URL } from '../actions/login-redirect'; 
import redirectMiddleware from './redirect-after-login'; 

jest.mock('react-router',() => ({hashHistory: { push: jest.fn()})) 

describe('redirect after login middleware',() => { 

    function setup() { 
     const store = { 
      subscribe:() => {}, 
      dispatch:() => {}, 
      getState:() => ({loginRedirectUrl: 'someLoginRedirectUrl'}) 
     }; 
     const next = jest.fn(); 
     const action = { type: REDIRECT_TO_LOGIN_REDIRECT_URL }; 
     return { store, next, action }; 
    } 

    it('should push the redirect URL to the hashHistory',() => { 
     const { store, next, action } = setup() 
     redirectMiddleware(store)(next)(action) 
     expect(hashHistory.push).toHaveBeenCalledWith('someLoginRedirectUrl') 
    }) 

}); 
+0

完美的答案!谢谢! – Lukas