Nest 프로젝트의 package.json - scripts의 테스트 명령어를 보면 Jest 테스트 라이브러리를 사용한다

테스팅 파일명에는 .spec 또는 .test 의 접미사가 있어야 한다

 

describe, it, test, expect

describe() 테스트 모듈을 그룹화하거나 계층별로 나눌 수 있고, it(), test(), expect()**** 키워드를 통해 테스트 코드를 작성한다

it()test() 키워드의 alias이며, 대체하여도 동일하게 작동한다

 

 

beforeAll, afterAll, beforeEach, afterEach

beforeAll(), afterAll() 는 테스트 파일의 시작과 끝에 한번 실행된다. 전역 변수를 관리할 수 있다

beforeEach(), afterEach() 는 테스트 파일 내 테스트 케이스의 시작과 끝에 실행된다

 

 

실행 순서

beforeAll → 
	[beforeEach → (describe - *it) → afterEach] → 
    	・・・ 
    →  [beforeEach → (describe - *it) → afterEach] 
→ afterAll

메서드 compile() 는 비동기식이므로 대기해야 합니다. 모듈이 컴파일되면 메서드를 사용하여 모듈이 선언하는 모든 정적 인스턴스(컨트롤러 및 공급자)를 검색할 수 있습니다

 

 

 

 

  beforeAll(async () => {
    const moduleFixture: TestingModule = await Test.createTestingModule({
      imports: [AppModule],
    }).compile();

    app = moduleFixture.createNestApplication();
    await app.init();
  });

단위 (Unit) 테스트

 

api.service.ts

import { Injectable } from '@nestjs/common';

@Injectable()
export class ApiService {

    /*
        get
    */
    getOne(id: number) {
        return id
    }

    getEmptyArr() {
        return []
    }

    getPlusOne(num: number) {
        return num + 1;
    }

    /*
        update
    */
    update(b: boolean) {
        return !b;
    }

}

 

api.service.spec.ts

import { Test, TestingModule } from '@nestjs/testing';
import { ApiService } from './api.service';
import { describe } from 'node:test';

describe('ApiService', () => {
  let service: ApiService;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [ApiService],
    }).compile();

    service = module.get<ApiService>(ApiService);
  });

  it('should be defined', () => {
    expect(service).toBeDefined();
  });

  describe('get', () => {
    it('should return id', () => {
      const id = 1;
      const ret = service.getOne(id);

      expect(ret).toEqual(id);
    })

    it('should return empty array', () => {
      const ret = service.getEmptyArr();

      expect(ret).toEqual([]);
    })
  })

  describe('update', () => {
    it('should return falsy', () => {
      const b = true;
      const ret = service.update(b);

      expect(ret).toBeFalsy();
    })
  })

});

 

테스트

$ npm run test

 

$ npm run test:cov

 

api.service.ts % Funcs 수치를 보면 75라고 나와있다. service.ts 파일의 함수는 총 4개인데, service.spec.ts에서는 3개의 함수의 테스팅 코드만 작성하였다

 

 

나머지 함수의 테스트 코드도 작성한 후, 실행하면 %Funcs 수치가 100으로 나온다

 


통합 (e2e, End to End) 테스트


npm run test:e2e 명령어를 통해 통합 테스트를 진행할 수 있다.

 

main.ts

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(
    new ValidationPipe(
      {
        whitelist: true,
        forbidNonWhitelisted: true,
        transform: true
      }
    )
  )
  await app.listen(3000);
}
bootstrap();

 

test/app.e2e-spec.ts

  beforeAll(async () => {
    const moduleFixture: TestingModule = await Test.createTestingModule({
      imports: [AppModule],
    }).compile();

    app = moduleFixture.createNestApplication();

    app.useGlobalPipes(
      new ValidationPipe(
        {
          whitelist: true,
          forbidNonWhitelisted: true,
          transform: true
        }
      )
    )

    await app.init();
  });

 

main.ts에 app에 대한 설정 (ex.GlobalPipes)을 했다면, app.e2e-spec.ts 파일에도 동일하게 설정해 주어야 한다

 

 


참고 링크

https://docs.nestjs.com/fundamentals/testing

https://nomadcoders.co/nestjs-fundamentals

https://jestjs.io/docs/api

'JavaScript > NestJS' 카테고리의 다른 글

[NestJS] 환경 변수 (config) 사용하기  (0) 2023.08.20
[NestJS] Logging 하기  (0) 2023.08.19
[NestJS] 경로 alias 설정하기  (0) 2023.08.17
[NestJS] API 생성하기 (+ CORS)  (0) 2023.08.17
[NestJS] 시작하기  (0) 2023.08.17

+ Recent posts