-
왜 테스트 코드를 작성 해야 하는지 알게 된 경험(typeorm bigint 이슈)Nest.js/TDD 2024. 3. 19. 18:01728x90
e2e 테스트 공부를 하고 있었는데
- posts.entity.ts
import { Column, Entity, PrimaryColumn } from 'typeorm'; @Entity() export class PostsModel { @PrimaryColumn({ type: 'bigint' }) id: number; @Column() author: string; @Column() title: string; @Column() content: string; @Column() likeCount: number; @Column() commentCount: number; }
- docker-compose.yaml
services: postgres: image: postgres:15 restart: always volumes: - ./postgres-data:/var/lib/postgresql/data ports: - '5437:5432' ....
postgres:15 image를 사용 하고 있고
"typeorm": "^0.3.20"
버전을 사용 하고 있는데- posts.e2e-spec.ts
it('(GET) get Post /posts/:postId', async () => { const postId = '1'; const res = await request(app.getHttpServer()) .get(`/posts/${postId}`) .expect(HttpStatus.OK); expect(res.body).toEqual(mockData); });
postId가 1이 있는 post를 가져와서 그게 res.body의 값과 일치 하는지 테스트 하는 코드인데
PostsController E2E Test › (GET) /posts/:postId › (GET) get Post /posts/:postId expect(received).toEqual(expected) // deep equality - Expected - 1 + Received + 1 Object { "author": "newjeans_official", "commentCount": 999999, "content": "멤버들 때문에 버거운 민지", - "id": 1, + "id": "1",
??? Expected 부분이 1인건 당연한거다 mockData를 id가 number인 1의 post를 미리 생성하는 코드를 작성 했기 때문에
그런데 Received가 string "1"이 오는게 말이 안된다. 혹시나 이전 type이 저장 된건가 (string값으로 설정한적은 없지만) 테이블을 지우고 다시 해보아도 string으로 나온다. service 부분에서 id값을 typeof로 출력 해보니async getPosts() { const posts = await this.postsRepository.getPostsRepository(); console.log('posts=====', typeof posts[0].id); return posts; } console.log posts===== string
string이 출력된다.
즉, postgresql에서 @PrimaryColumn 데코레이터로 선언한 type: 'bigint' 또는 'int8' 타입이 string으로 런타임에 출력된다는것이다. !!!!
github나 구글링 해보았는데 관련 이슈를 아직까진 링크를 찾지 못하였지만 찾게 되면 글에 추가 할 예정입니다.https://github.com/typeorm/typeorm/issues/2400#issuecomment-509211852
해당 이슈글을 읽어보면 TypeORM은 타사 라이브러리를 사용하여 bigint를 지원할 계획이 없는 것 같습니다. 라고 한다.
2019년도 이슈글이면 지금쯤 고쳐 지지 않았을까? 내가 사용방법을 잘 모르는건가?
https://github.com/typeorm/typeorm/issues/9813
최근 이슈에도 같은 현상의 이슈가 있다. 그만 알아보자
만약 테스트코드를 작성 하지 않았다면, 실제 사용자 관점에서 실행되는 e2e 테스트를 진행하지 않았다면 Typescript에서 타입체커는 통과되고 런타임 환경에서는 string으로 리턴 되는 id값을 반환 했을것이다!
728x90'Nest.js > TDD' 카테고리의 다른 글
jest에서 모킹함수 'toHaveBeenCalledWith' 의 이상한점 (0) 2024.03.26 e2e 테스트를 공부 하면서 save함수의 리턴값과 toEqual로 값비교 (0) 2024.03.20 nestjs-test-coverage에서 제외 파일 설정 (0) 2024.03.09 Nestjs에서 테스트 코드 작성시 Nest can't resolve dependencies in the RootTestModule context 에러 (0) 2024.01.09 vscode - jest를 위한 Jest Extension 설치 (0) 2024.01.04