기존에 처리하던 방식

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의 실행여부를 검증할 수 있다.