먼저 module별로 테스트 하는 방법은 찾아내지 못했다.
app.module.ts
를 테스트 하기로 했고, 신기하게도 테스트 돌리니 전에 get에서 find로 함수명을 바꿨는데, resolver에는 적용되지 않았던 부분을 잡아줬다!
블로그에는 app을 INestApplication
를 이용해서 테스트 하라고 하지만, 그럴 필요 없다.
supertest도 import * as request from 'supertest'
로 하라고 하지만 에러가 난다. (아마 버전 차이일 수도..)
import request from 'supertest'
로 변경해주니 에러가 나지 않았다.
그래서 import 해주어야 될 것은 아래와 같다
import { Test } from '@nestjs/testing';
import request from 'supertest';
import { AppModule } from './app.module';
그리고 테스트 전과 테스트 후 처리를 위해 다음과 같은 코드를 추가해 준다.
beforeAll(async () => {
const module = await Test.createTestingModule({
imports: [AppModule],
}).compile();
app = module.createNestApplication();
await app.init();
});
afterAll(async () => {
await app.close();
});
이렇게 세팅 하고 테스트 코드를 짜면 예쁘게 200으로 떨어지는 테스트 코드를 볼 수 있을 것이다.
그런데 :id값을 받아야 할 때는 어떨까?
아무리 return request(app.getHttpServer()).get('/brands/1').expect(200)
을 해줘도 500 에러가 예상된다는 결과를 받았다.
그래서 id값을 숫자로 인식하지 못하는 것 아닐까? 라는 생각에 도달하게 되었고 찾아보니 controller에서 추가해줘야 하는 부분이 있었다.
nest.js가 예쁘게 숫자로 파싱 해주지만, 테스트코드는 그렇지 못하나 보다.
아래와 같이 controller를 변경해준다.
async findOne(@Param('id', ParseIntPipe) id: number) {
ParseIntPipe
는 받은 id값을 int로 파싱해주는 역할을 한다고 한다.
이로써 우리는 500에러 받는 법과, 200 성공 받는 법을 둘 다 알게 되었다.
- 2023.08.04
POST, PUT, DELETE를 하면 실제 DB가 변경된다.
그렇기 때문에 테스트 한 후에 롤백을 해주어야 되는데 그 부분은 찾지 못해서 더 공부가 필요할 것 같다.
(일단 xit
으로 테스트 skip 해두었다.)
- 2023.08.05
Rollback하는 방법을 못찾아서 결국에는
GET → POST → PUT → DELETE 순으로 테스트 하고, POST된 마지막 값을 PUT과 DELETE에서 삭제하는 방향으로 테스트를 진행했다.
'TIL' 카테고리의 다른 글
token을 관리해보자! (0) | 2024.08.19 |
---|---|
x-api-key authorization (0) | 2024.08.19 |
mysql typeorm으로 한방에 generate하기 (0) | 2024.08.19 |
구글 오늘 뭐먹지 챗봇 만들기 (0) | 2024.08.19 |
E2E cypress 테스트 코드 짜기 (0) | 2024.08.19 |