필자는 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를 적용할 수 있는 방법을 찾았다.
바벨을 사용하여 import를 사용하는 방법
이 블로그에 잘 정리되어 있다!
일단 이렇게 해결했지만 이렇게 되면 설치하는 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로 바꾸어 주었다.
해결...!
생각보다 쉽게 고칠 수 있어서 좋았지만 이게 맞는 방법인지는 잘 모르겠다..허허