Express에서 Jest, Supertest를 통해 E2E 테스트를 작성해왔다. Nestjs에서도 동일하게 Jest, Supertest를 통해 테스트를 작성할 수 있다.
다만, Express에서 사용하는 것과 다르게 Nestjs는 NestFactory를 사용해 app을 생성하고 실행한다.
beforeAll(async () => {
const module: TestingModule = await Test.createTestingModule({
imports: [AppModule],
})
.compile();
app = module.createNestApplication();
await app.init();
});
모든 테스트를 진행하기 전에, Test.createTestingModule
을 통해 TestingModule을 생성한다. 해당 Module 내에서 기존에 Module을 선언하는 것과 같이 imports
, providers
등을 선언할 수 있다.
Module에 대해 컴파일을 진행한 후 createNestApplication()
메서드를 통해 app을 생성할 수 있다.
기존 Express에서 Supertest를 사용한 것과 같이 사용할 수 있다.
import * as request from 'supertest';
it('test', async() => {
const response = request(app.getHttpServer())
.get('/api/path')
.send()
expect(response.statusCode).toEqual(200);
});
요청에 대한 응답 값을 테스트할 수 있다.
Nestjs의 TestingModule에서 특정 서비스에 대한 Mocking을 통해 실제 DB를 사용하지 않고 E2E 테스트를 진행할 수 있다.
const service = {
function: () => ({result: 'result'});
};
beforeAll(async () => {
const module: TestingModule = await Test.createTestingModule({
imports: [AppModule],
})
.overrideProvider(Service)
.useValue(service)
.compile();
app = module.createNestApplication();
await app.init();
});
TestingModule을 생성할 때, overrideProvider()
와 useValue()
를 통해 특정 Provider를 Mock Provider로 대체할 수 있다.
위 코드를 통해 테스트를 진행하면, Controller에서 주입받은 Service라는 객체 대신 테스트에서 선언된 service
객체를 사용하게 된다.
overrideProvider()
외에도 overrideFilter()
, overrideInterceptor()
, overridePipe()
등 다른 객체에 대해서도 Mocking을 진행할 수 있다.