본문 바로가기
개발공부/NestJS

[노마드 코더 NestJS로 API 만들기] 3 Testing Jest

by bzerome240 2023. 8. 16.

 

  • 유닛 테스트: 모든 function을 하나씩 테스트하는 것
  • e2e 테스트: 이페이지로 가면 특정페이지가 나와야하는 경우 (사용자 관점)

 

 


 

getAll, getOne, deleteOne 등 만들었던 함수들 유닛 테스트하기

 

Jest가 spec.ts 를 찾을 수 있도록 돼있다. 테스팅하고 싶은 파일명에 spec.ts를 붙이면 된다.

 

spec.ts 에 예시 추가

it('should be 4', () => {
  expect(2+2).toEqual(4);
})

 

movie.service.spec.ts 에 유닛테스트 만들기

get

describe('getAll', () => {
  it('should return an array', () => {
    const result = service.getAll();
    
    // 배열로 리턴하는지 체크
    expect(result).toBeInstanceOf(Array);
  });
});

describe('getOne', () => {
  it('should return a movie', () => {
    service.create({
      title: 'Test Movie',
      genres: ['test'],
      year: 2000,
    });
    
    const result = service.getOne(1);
    
    expect(result).toBeDefined();
    expect(result.id).toEqual(1);
  });
  
  it('should throw 404', () => {
    try {
      service.getOne(999);
    } catch(e) {
      expect(e).toBeInstanceOf(NotFoundException);
      expect(e.message).toEqual('Movie with Id 999 not found.');
    }
  });
});

delete

describe('deleteOne', () => {
  it('deletes a movie', () => {
    service.create({
      title: 'Test Movie',
      genres: ['test'],
      year: 2000,
    });
    
    const beforeDelete = service.getAll().length;
    service.deleteOne(1)
    const afterDelete = service.getAll().length;
    
    expect(afterDelete).toBeLessThen(beforeDelete);
  });
  
  it('should throw 404', () => {
    try {
      service.deleteOne(999);
    } catch(e) {
      expect(e).toBeInstanceOf(NotFoundException);
    }
  });
});

create

describe('create', () => {
  it('should create a movie', () => {
    const beforeCreate = service.getAll().length;
    
    service.create({
      title: 'Test Movie',
      genres: ['test'],
      year: 2000,
    });
    
    const afterCreate = service.getAll().length;
    
    expect(afterCreate).toBeGreaterThen(beforeCreate);
  });
});

update


describe('update', () => {
  it('should update a movie', () => {
    service.create({
      title: 'Test Movie',
      genres: ['test'],
      year: 2000,
    });

	service.update(1, { title: 'Updated Test' });
    const result = service.getOne(1);
    
    expect(result.title).toEqual('Updated Test');
  });
  
  it('should throw 404', () => {
    try {
      service.update(999, {});
    } catch(e) {
      expect(e).toBeInstanceOf(NotFoundException);
    }
  });
});

 


 

테스트 코드는 describe와 it 구문으로 구성된다.

  • describe : 테스트 스위트를 작성하는 블록 
  • it : 특정 테스트 시나리오를 작성하는 부분

 

BDD 스타일: Given / when / then 

 

  • SetUp : 모든 테스트 케이스 수행 전 수행해야하는 조건  
  • TearDown : 테스트 후에 후처리

해당 테스트 개념을 위해 Jest에서는 beforeAll(), beforeEach(), afterAll(), afterEach() 를 제공한다.

 


 

테스트 커버리지 측정이 가능하다.

이 결과를 이용해서 CI/CD 과정에 포함하여 기준이 만족되지 못하면 릴리즈를 하지 못하도록 할 수 있다.

루트 디렉터리아래에 coverage 디렉터리가 생기고 저장된다.

npm run test:cov

watch로 감시하면 테스트 파일 수정될때마다 테스트 실행된다.

npm run test:watch

 

 

728x90
반응형

댓글