mockData = await postsRepository.save({
id: 1,
author: '타입스크립트',
title: '타입스크립트',
content: '타입스크립트',
likeCount: 0,
commentCount: 0,
created_at: new Date(),
updated_at: new Date(),
});
it('(GET) get Post /posts/:postId', async () => {
const res = await request(app.getHttpServer())
.get(`/posts/${mockData.id}`)
.expect(HttpStatus.OK);
expect(res.body).toEqual(mockData);
});
미리 생성된 post의 id로 get요청해서 특정 post id의 값을 res body로 받아서 그걸 생성한 mockData랑 비교하는 e2e 테스트 코드인데 아래와 같은 에러가 발생한다.
PostsController E2E Test › (GET) /posts/:postId › (GET) get Post /posts/:postId
expect(received).toEqual(expected) // deep equality
- Expected - 2
+ Received + 2
- "created_at": 2023-03-07T15:38:06.000Z,
+ "created_at": "2023-03-07T15:38:06.000Z",
- "updated_at": 2023-03-07T15:38:06.000Z,
+ "updated_at": "2023-03-07T15:38:06.000Z",
아무래도 repository의 save 메서드 한뒤 리턴값은 create_at와 update_at 필드의 javascript 런타입 타입은 number로 반환되는것 같다.
그리고 findOne으로 찾은 반환값은 response.body의 create_at와 update_at 타입은 string타입이여서 일치하지 않다는 에러가 나는것 같다.
해결 방법으로는 .toISOString() as unknown as Date 이런식으로 사용해서 타입체커 환경에서는 Date타입으로 타입스크립트를 속이고 런타임 환경에서는 string으로 변환해줘서 성공적으로 테스트 코드를 통과 시켰다. 물론 실제 비지니스 로직 코드에 이런걸 적용하면 큰일 나지만 테스트 환경에서는 이런식으로 해도 될것 같다(?)