[test] app.address is not a function 에러 해결

김지원·2021년 9월 1일
0

TIL

목록 보기
2/4
post-thumbnail

🤯 에러..

필자는 supertest로 통합테스트를 진행하고 tdd를 진행하고 있었다.

test.spec.js

const app = require("../../app");
const request = require("supertest");

const server = request(app);
...

이렇게 되어 있었고 app.ts에서는 export default로 외부 모듈화를 해주고 있었다.

그리고 test를 돌리니

TypeError: app.address is not a function

해결 방안

필자는 본 코드를 ts로 사용하기 때문에 모듈화 할때 export default를 하여 import로 모듈을 다른 곳에서 사용했다.

하지만 jest에서는 import를 허용하지 않는다..

왜냐하면 과거의 노드에서 모듈을 사용해야 되기 때문에 CommonJS로 실행 되기 때문이다😂

그래서 일단 import를 적용할 수 있는 방법을 찾았다.

1. babel을 이용

바벨을 사용하여 import를 사용하는 방법
이 블로그에 잘 정리되어 있다!

2. jest에서 사용하는 async, await을 사용하기 위해 하는 설정

잘 정리되어 있는 블로그

일단 이렇게 해결했지만 이렇게 되면 설치하는 babel관련 라이브러리가 많아진다 ㅠ

그래서 새로운 방법을 생각해보았다..

다른 방법!

생각보다 쉬웠다. app을 module.exports로 보내자!

여기서 export default와 module.exports가 가져올 때의 차이가 중요하다.

require는 module객체에 담겨서 값을 받아오고
import는 값 자체를 가져온다.

하지만 이것보다 중요한 점은 module.exports와 require가 commonJS에 알맞는 문법인 점이다.

원래코드

app.ts

const app: express.Application = express();

export default app;

www.ts

import app from "../app";
import * as express from "express";

const application: express.Application = app;
const PORT: number = Number(process.env.PORT) || 8080;

application
  .listen(PORT, () => console.log(`${PORT} 포트에서 서버가 가동되었습니다.`))
  .on(`error`, (err) => console.log(err));

원래는 이렇게 import와 export default로 했다면

저 import와 export default를
require와 module.exports로 바꾸어 주었다.

해결...!

생각보다 쉽게 고칠 수 있어서 좋았지만 이게 맞는 방법인지는 잘 모르겠다..허허

profile
backend-developer

0개의 댓글