사실 트러블 슈팅이라긴보단 Jest에 적응해가는 과정을 기록하고 싶었다.
const mockUser = undefined;
const mockReq = { user: mockUser };
expect(memberController.getMyInfo(mockReq as unknown as Request))
.toThrow(ManipulatedTokenNotFiltered);
처음에 위와 같이 실행하면 getMyInfo()를 실행한 후에 발생한 Error를 catch할 수 있을거라고 예상하고 지속해서 시도했으나, 자꾸 아래와 같이 getMyInfo()의 내부에서 Error가 발생한다고 테스트가 실패하는 경우가 발생했다.
에러가 발생하는 것은 의도된 동작이었으나, 왜 테스트가 실패하는지 이해하지 못해 toThrow() 메서드에 대해 자세히 찾아보았다.
**.toThrow()
**는 expect 내부의 함수를 호출하는 시점에서 예외가 발생하는지를 체크한다고 한다.
그렇기에 위의 코드에서 .toThrow()
가 의도대로 작동하지 않는 이유는memberController.getMyInfo(mockReq as unknown as Request)
를 호출하는 시점에서는 예외가 아직 발생하지 않기 때문인 것이다.
따라서 함수 호출 시 예외가 발생하는 지점에서 **.toThrow()
**가 사용될 수 있도록 즉시 실행 함수 표현식 (IIFE)
을 사용하도록 코드를 수정해야 했고, 결론적으로 아래와 같이 테스트 코드를 고치면 정상적으로 동작한다.
const mockUser = undefined;
const mockReq = { user: mockUser };
expect(() =>
memberController.getMyInfo(mockReq as unknown as Request),
).toThrow(ManipulatedTokenNotFiltered)