[nestjs] response 모킹하기

Uhan33·2024년 4월 9일
0

TIL

목록 보기
61/72

nestjs에서 테스트 코드를 작성하던 중 로그인을 하면 쿠키를 발급받는데,
res.cookie로 쿠키를 발급할 때 res 정의가 문제가 되었다.
일반적으로 express에서 불러오는 response를 사용하면 실제로 해당 모듈에 접근을 하는데,
단위 테스트 코드에서는 모듈에서 정의해놓은 것들을 사용할 수 없어 에러가 발생했다.
그래서 다른 분의 도움을 받아 response를 모킹하고 안에 가짜 쿠키를 정의해주었다.

response Mocking

우선 response를 모킹해야한다. 그저 jest.fn으로 정의하면 안되고 실제 Response를 가지고 모킹해주어야 한다. 왜냐면, 본인이 작성한 코드를 테스트 하기 위해 실제로 사용되는 type이 중요하기 때문에 response의 타입을 가지고 있어야 한다.
그래서 Partial을 활용해 줄 것이다.

const mockResponse = (): Response => {
  const res: Partial<Response> = {};
  res.cookie = jest.fn().mockReturnValue(res);
  return res as Response
}

그리고 정의해준 res를 테스트 함수 실행 전 마다 초기화 시켜준다.

describe('UserController', () => {
  let res: Partial<Response>;
  beforeEach(async () => {
    res = mockResponse();
  });
});

테스트 코드에 사용하기

이제 response를 사용해야 하는 테스트 코드에서 사용해보자
res를 위에서 미리 정의한 mockResponse로 정의해주고,
실제 res가 필요한 userController.login에 res를 넣어주면
res.cookie는 실제 쿠키가 아닌 우리가 위에서 만들어준 가짜 쿠키를 사용하게 될 것이다.

  describe('login', () => {
    it('로그인 성공', async () => {
      const res = mockResponse();
      const result = { 'access_token': 'test_jwt_token' };
      jest.spyOn(mockUserService, 'login').mockImplementationOnce(() => result);
      expect(await userController.login(loginDto, res)).toEqual({ message: '로그인 성공!' });
    })
  })

cookie말고 status, json, ... 등등 response의 메서드들을 전부 모킹하여 사용할 수 있다.
한참을 이거때문에 고민했는데 도움 받아서 정말 다행이다..

0개의 댓글