2017-12-23 3 views
0

비동기 함수가 전달 될 때 mapDispatchToProps 함수를 테스트하려고합니다. 나는 mapDispatchToProps를 테스트하는 방법에 대한 Dan Abramov의 제안을 읽었으며 내 코드를 테스트하려고합니다. 여기 test mapDispatchTo 비동기 작업

TypeError: Cannot read property 'then' of undefined 

내 테스트입니다 내가 오류를 얻고있다

...

describe("mapDispatchToProps",() => { 

    const dispatchSpy = jest.fn(); 
    const {signupUser} = mapDispatchToProps(dispatchSpy); 

    it("should dispatch signupActions.signupUser()",() => { 
     // mockAxios.onPost(endpoints.SIGNUP,{}) 
     //   .reply(200,'test_success'); 
     // tried with and without mockAxios 

     signupUser({}) 
     const spyLastCall = dispatchSpy.mock.calls[0][0]; 
     expect(spyLastCall) 
      .toEqual(signupActions.signupUser({})); 
    }) 

}) 

내가 테스트 할 기능

...

export const mapDispatchToProps = dispatch => { 
    return { signupUser: (user) => { 
     dispatch(signupActions.signupUser(user)) 
      .then((response) => { 
       // do something on success 
      }, (error) => { 
       // do something on failure 
      }) 
    } 
} 

이미 signupActions.signupUser를 테스트했으며 약속을 반환한다는 것을 알고 있습니다. 코드는 다음과 같습니다.

export function signupUser(user) { 
    return (dispatch) => { 
     return dispatch(rest.post(SIGNUP,user)) 
      .then((response) => { 
       return Promise.resolve(response); 
      },(error) => { 
       return Promise.reject(error) 
      } 
     ) 
}} 

내가 뭘 잘못하고 있니?

시가 : 나는 또한 시도 : 같은 결과 관심있는 사람들을위한

+0

'mapToDispatch'에서 중괄호를 반환하거나 제거해야 할 수도 있습니다. 예 : return dispatch (signupActions.signupUser (user)) –

+0

코드가 잘 실행되어 중괄호가 일. 그저 문제가있는 테스트뿐입니다. – user1795370

답변

0

const dispatchSpy = jest.fn().mockImplementation(() => { 
    return p = new Promise((reject,resolve) => { 
     resolve({}) 
    }) 
} 

, 내 테스트 많은 청소기를했다 mergeProps를 사용하여 끝났다.

describe("signup",() => { 

    /// ... ownProps and propsFromState declared here 

    const dispatchSpy = jest.fn((x) => {}); 

    const { 
     dispatchSignupUser, 
    } = mapDispatchToProps(dispatchSpy); 

    const signupUser = mergeProps(propsFromState,propsFromDispatch,ownProps); 

    describe("mapDispatchToProps",() => { 
     it("should dispatch signup user on dispatchSignupUser",() => { 
      const spyOn = jest.spyOn(signupActions,'signupUser');  
      dispatchSignupUser({test: "test"}); 
      expect(spyOn).toHaveBeenCalledWith({test: "test"}); 
     }) 
    }) 

    describe("mergeProps",() => { 
     it("should do something on success",() => { 
      propsFromDispatch.dispatchSignupUser jest.fn().mockImplementation((x) => { 
       return new Promise((resolve,reject) => { return resolve({})}) 
      });  
      return signupUser({}).then(() => { 
       expect(history.location.pathname).toEqual("/signup/thank-you") 
      }, (error) => {}) 
     }) 
    }) 

}) 

는 희망이 도움이됩니다 ... 지금은 ...

export const mapDispatchToProps = dispatch => { 
    return { dispatchSignupUser: (user) => { 
     dispatch(signupActions.signupUser(user)) 
    } 
} 

export const mergeProps = (propsFromState,propsFromDispatch,ownProps) => { 
    return { 
     signupUser: (values) => { 
      return propsFromDispatch.dispatchSignupUser(values) 
       .then(() => { // do something on success }, 
        () => { // do something on failure}) 
    } 
} 

을하고 난 개별적으로 테스트!