ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2019-10-31 개발일지
    개발일지 2019. 10. 31. 18:37

    # 오늘의 TODO

    • JEST
      • 학습
      • 프로젝트에 적용해보기

     

    # 프로젝트에 적용 진행 내용

    1. 적용 시작부터 문제 발생

    프로젝트에 이미 만들어져있는 API들을 테스트하기 위해 supertest 모듈을 이용해서 HTTP 통신 테스트 코드를 짰다.

     

    supertest 객체를 만드는 것에 대해 반복되는 코드를 작성하기 귀찮아서 모듈로 하나 만들어놓고 import 해서 사용하는 코드를 짰다.

     

    supertest.ts

    import supertest from 'supertest';
    import app from '../../../src/app';
    
    const http = supertest(app);
    
    export default http;
    

     

    프로젝트의 index.ts에서 app 객체를 export 하여 모듈화한다.

    그리고 supertest.ts 파일에서 import 하여 supertest 객체를 만든다.

     

    그리고 테스트 코드 파일을 두개 만들고 API 테스트 코드를 작성한다.

    a.test.ts

    import http from './supertest';
    
    describe('GET /api/A', () => {
        test('A status 200', async () => {
            const response = await http.post('/api/A');
            expect(response.status).toBe(200);
        });
    });
    

     

    b.test.ts

    import http from './supertest';
    
    describe('POST /api/B', () => {
        test('B status 200', async () => {
            const response = await http.post('/api/B');
            expect(response.status).toBe(200);
        });
    });
    

     

    이러고 test를 수행하니 에러를 마주쳤다.

     

     

    내용은 '5050포트로 이미 주소가 사용 중이다.' 라는 에러이며, 에러 위치로 listen()에 커서를 맞췄다.

    EADDRINUSE는 대충 Error Address In use 의 약잔가..?

     

     

    2. 해결 과정

    해당 문제는 첫번째 A 테스트 실행이 끝나면 서버가 리스닝 상태로 계속 대기하고 있게 되는 것이다.

    그래서 두번째 B 테스트가 진행되면 이전 A 테스트 파일의 프로세스에서 포트를 계속 사용하고 있기 때문에 오류를 발생시키는 것이다.

     

    해당 문제를 해결하려면 테스트 환경이 실행될 때는 app을 리스닝하지 않는 것이다.

     

    이는 여러 방법이 있겠지만 대표적으로 서버를 리스닝하는 부분을 따로 파일로 분리시키는 것이다.

     

     

    이렇게 파일을 분리시키고 TEST 시에는 index.ts만 읽어들인다.

    supertest의 인자로 받는게 app.ts가 아닌 index.ts다.

     

     

    하지만 현재 코드를 유지한 상태로 분기처리를 통해 해결하는 방법도 있다.

     

    아래의 index.ts를

     

    다음과 같이 변경한다.

     

    NODE_ENV에 jest를 넣고 jest가 아닌 환경에서만 app을 리스닝하는 것이다.

     

    이후 package.json의 test 스크립트를 아래와 같이 변경한다.

     

    기존에는 그냥 "jest"만 적혀서 테스트를 실행했었는데, jest를 실행하기 전 NODE_ENV 인자로 jest를 넘겨서 실행한다.

    • Window 환경에선 "set NODE_ENV=jest&&jest"로 작성한다.
    • Linux 환경에선 "NODE_ENV=jest jest"로 작성한다.

     

     

    이후로 npm test 스크립트를 실행하면 에러가 사라진다.

     

     

     

     

    이제 본격적으로 TDD를 시작해볼 수 있다!

     

    참고:

    https://stackoverflow.com/questions/53711347/server-instances-jest-and-listen-eaddrinuse-3000

     

    Server instances, jest and 'listen EADDRINUSE :::3000'

    Am new to jest, node and express, and am having a problem with testing my app. The actual code seems to be working - it's just when passing the server instance to each of the test files (user.test...

    stackoverflow.com

    https://blog.campvanilla.com/jest-expressjs-and-the-eaddrinuse-error-bac39356c33a

     

    Jest, ExpressJS and the EADDRINUSE error

    Potential fix for an obscure error. 🕵️‍♂️

    blog.campvanilla.com

     

    '개발일지' 카테고리의 다른 글

    2019-11-04 개발일지  (0) 2019.11.04
    2019-11-01 개발일지  (0) 2019.11.01
    2019-10-30 개발일지  (0) 2019.10.30
    2019-10-29 개발일지  (0) 2019.10.29
    2019-10-28 개발일지  (0) 2019.10.28
Designed by Tistory.