7. nest.js
e2e 테스트(엔드 투 엔드 테스트)
movie와 관련된 애플리케이션의 모든 부분을 테스트할 때 필요
npm run test:e2e
FAIL test/app.e2e-spec.ts (5.018 s)
AppController (e2e)
✕ / (GET) (289 ms)
● AppController (e2e) › / (GET)
expected 'Hello World!' response body, got 'welcome to my movie api'
결과가 hello world와 매칭되지 않아 에러 발생
GET /movie test
it("/movie (GET", () => {
return request(app.getHttpServer())
.get("/movies")
.expect(200)
.expect([]);
})
GET POST DELETE
describe('/movies', () => {
it('GET', () => {
return request(app.getHttpServer())
.get('/movies')
.expect(200)
.expect([]);
});
it("POST", () => {
return request(app.getHttpServer())
.post("/movies")
.send({
title: "test",
yesr: 2000,
genres: 'romance'
})
.expect(201);
});
it("DELETE", () => {
return request(app.getHttpServer()).delete('/movies').expect(404);
})
})
describe로 묶어서 표현 가능
Nest.js 사용시 발생할 수 있는 에러
네스트는 테스트마다 어플리케이션을 생성한다.
- 하나는 화면상에 나타날 수 있는 어플리케이션
- 다른 하나는 각 테스트를 위한 어플리케이션
it.todo
describe('/movies/:id', () => {
it.todo('GET');
it.todo('DELTE');
it.todo('PATCH');
})
/movies/:id
✎ todo GET
✎ todo DELTE
✎ todo PATCH
만약 테스트를 수행할 때 마다 어플리케이션이 새로 생성되는 것을 원치 않는다면?
→ 테스팅을 시작하기 전에 어플리케이션을 만든다. (데이터베이스를 일일이 계속 넣어줄 필요 없이 재사용 가능하다.)
beforeAll(async () => {
const moduleFixture: TestingModule = await Test.createTestingModule({
imports: [AppModule],
}).compile();
app = moduleFixture.createNestApplication();
await app.init();
});
- beforeEach를 beforeAll로 바꾼다.
이 때, 실제 화면상의 어플리케이션에서는 id를 number로 받지만, 테스팅 서버에서는 string으로 받아 404에러가 발생한다.
이유는 main.ts에서 transform 기능을 true로 해놓았기 때문이다. 하지만 어떤 이유로, e2e에서 transform이 적용되지 않고 있다.
이유는 간단하다. 테스트 어플리케이션 생성 시에 어떠한 파이프에도 올리지 않아 테스트에서도 실제 어플리케이션 환경이 적용되지 않았기 때문이다
app.useGlobalPipes(
new ValidationPipe({
whitelist: true,
forbidNonWhitelisted: true,
transform:true,
})
main.ts에 작성했던 글로벌 파이프를 테스트 파일에도 동일하게 작성한다.
transform이 정상적으로 동작하며 원하는 테스트 결과를 수행하는 것을 확인할 수 있다.