기존에 처리하던 방식
this.setState(state, () => {
this.props.requestAPI();
});
위의 코드가 있다고 하자.
기존에는 setState 함수를 jest.fn
으로 mock 시켜버리니, callback의 실행을 테스트할 방법이 없다고 생각했다.
그래서 requestAPI
의 실행은 검증할 수 없었고, 아래와 같이 expect문을 작성하여 익명의 함수가 전달되었다는 테스트만 작성했다.
expect(mockSetState).toBeCalledWith(state, expect.any(Function));
mockImplementaion 사용하기
혹시나 어떤 특별한 방법이 있을까? 하고 궁금하여
jest.fn how to run callback
이라고 구글에 검색했다.
그런데.. 기존에 알고있던 mockImplementation
함수를 사용하여 아주 쉽게 테스트할 수 있었다.
ClassToTest.prototype.setState = jest.fn().mockImplementation((state, callback) => {
callback();
});
위와 같이 mockImplementation
함수를 통해 setState 함수의 구현을 재정의 해준다.
코드를 보면 인자로 받은 callback
을 실행시킨다.
그러면 Test에 의해 실행된 구현 코드는 실행당시에 setState 함수의 구현부를 ``` (state, callback) => {callback()} ``` 으로 인지하게되고, 그냥 인자로 받은 callback을 실행한다.
이제
expect(mockRequestAPI).toBeCalled();
이렇게 검증하면 callback의 실행여부를 검증할 수 있다.