[이슈] Mongoose(node.js)+JEST 동시 사용시 주의점

2021. 1. 29. 14:08프로그래밍-Web/Jest(TDD)

mongoosejs.com/docs/jest.html

 

Mongoose v5.11.14: Testing Mongoose with Jest

Testing Mongoose with Jest Jest is a client-side JavaScript testing library developed by Facebook. Because Jest is designed primarily for testing React applications, using it to test Node.js server-side applications comes with a lot of caveats. We strongly

mongoosejs.com

 

명심하자

jest는 React를 위해 만들어진 라이브러리다

애초에 기본동작도 jsDOM이라는 가상돔에서 한다

Node.js의 Mongoose api를 사용하는 경우라면 설정해줘야 되는 부분이 많다

 

1) jest 동작 환경 세팅

 

앞서말했듯 jest는 기본적으로 jsDOM에서 돌아가는데, 이를 node위에서 돌아가도록 설정해줘야 한다

 

2) Timer가 포함된 Mock함수

 

는 사용하면 안된다

 

보통 테스트시간을 효율적으로 만들기 위함인데, 기본적으로 jest는 5초를 넘기면 유닛테스트 에러가 나도록 설정되어있다

따라서 timeout에 세팅한 시간이 5초를 초과하면 에러가 먼저 나는데, 이러한 상황을 해결하기 위해 useFakeTimers 메소드를 사용하여 타이머들을 바로 실행하도록한다

 

하지만, 

실제 Mongoose 공식 문서에서는 stub이라는 메소드를 사용하여 wrapper를 설정하도록 조언하고 있다

 

3) 통합테스트가 병행되는 경우

 

jest로 유닛테스트를 만들고 supertest 구문을 작성하면

 

ReferenceError: You are trying to `import` a file after the Jest environment has been torn down.

 

라는 문구가 뜬다

디버깅을 해보니 테스트에 소모되는 시간이 서버가 세팅되는 시간보다 짧기 때문에 발생하는 문제인걸로 추정되었다

따라서 테스트환경과 실행환경에서 DB에 접근하는 로직을 다르게 해줘야 한다.

통합테스트에 대한 DB 접근 자체를 별도로 한다는 것이다. 

(헷갈리지 말아야 할 부분은 유닛테스트 로직은 실제로 DB연결, 캐싱, 네트워크 등 부가적인 시간을 빼고 기능만 테스트 한다는 점이다. 따라서 DB 연결은  실제 DB와 연결해서 테스트하는 통합테스트에 별도 로직으로 넣어주자)

 

보통 이런 경우 패키지매니저로 cross-env라는 라이브러리를 설치한다.

얘는 알아서 command에 따른 .dotenv 설정을 다르게 해준다

 

원래 서버의 index 파일에서 db연결은 dotenv 가 test가 아닌 경우에만 동작하도록 변경해주고

 

실제 연결로직은 통합테스트 로직에 입력해준다.

이때 beforeAll로직을 사용하여 테스트 코드 빌드전에 DB접근부터 하도록 설정한다.