Nestjs E2E testing

Sinf·2022년 6월 14일
0

고민의 흔적

목록 보기
28/38
post-thumbnail

Nestjs E2E testing

Express에서 Jest, Supertest를 통해 E2E 테스트를 작성해왔다. Nestjs에서도 동일하게 Jest, Supertest를 통해 테스트를 작성할 수 있다.

다만, Express에서 사용하는 것과 다르게 Nestjs는 NestFactory를 사용해 app을 생성하고 실행한다.

TestingModule

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을 생성할 수 있다.

Supertest

기존 Express에서 Supertest를 사용한 것과 같이 사용할 수 있다.

import * as request from 'supertest';

it('test', async() => {
  const response = request(app.getHttpServer())
  	.get('/api/path')
  	.send()
  
  expect(response.statusCode).toEqual(200);
});

요청에 대한 응답 값을 테스트할 수 있다.

Mocking

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을 진행할 수 있다.

profile
주니어 개발자입니다. 🚀

0개의 댓글