카테고리 없음

jest const 변수 mock 하는 방법

코드냠냠꿀꺽 2022. 11. 22. 23:21

요즘 전에 했던 프로젝트들을 리팩토링 하고, 시간 부족으로 인해 중간중간 비어있는 test code들을 작성 중이다. 오늘은 express, jest, typescript를 사용하여 진행했던 commerce platform clone 프로젝트 테스트 코드를 작성 중 해결했던 문제에 대해 기록하려 한다.

 

signup의 service layer test 코드 작성 중 비밀번호를 해싱과 관련된 함수들을 따로 util 폴더에 분리시켜놨었는데 아래 함수를 mocking 하려다가 오류가 발생했다.

const encryptPassword = async (password: string) => { ...

encryptPassword가 const로 선언되어 있기 때문에 mock으로 재할당 할 수 없었다.

 

전에 javascript로 했던 프로젝트에서 test 코드를 작성하다가 이 문제를 겪었었는데,

(javascript는 동적타입 언어로 test실행을 해야지만 read-only라고 오류 메시지를 보여준다.)

그때 당시에 구글링 해서 얻은 해결책으로는 함수 하나를 가져오지 않고 모듈 전체로 가져와서 재할당하면 해결됐었다.

import * as ebcrypt from '../util/encryptPassword';

하지만, typescript에서 이 방식은 해결책이 되지 않았다.

 

 

결국 찾은 해결책!

1. requireMock

jest 공식 문서를 보면 requireMock은 실제 모듈 대신 mock module을 Return 해준다고 한다. 아래와 같이 encrypt 모듈을 받아오고, mockEncrypt의 encryptPassword를 사용하여 재할당 해주었더니 해결되었다.

const mockEncrypt = jest.requireMock('../util/encryptPassword.ts');

mockEncrypt.encryptPassword = jest.fn(() => 'hashedpassword');

 

2. mock 안에서 재할당

아래와 같이 mock 함수 안에서 재할당 해주어도 된다.

jest.mock('../util/encryptPassword.ts', () => {
  return { encryptPassword: jest.fn(() => 'hashedpassword') };
});

 

하지만, 나는 테스트 별로 각각 return 값을 다르게 해주어야 해서 requireMock 방식으로 해결하였다.

 

 

 

혹시, 잘못된 내용이 있다면 피드백해주시면 감사하겠습니다