Node.js

Nodejs Test하는 이유와 Jest

쿠와와 2021. 1. 12. 13:10

테스트를 하는 이유

자신이 만든 서비스가 제대로 동작하는지 테스트해야 함

  1. 기능이 많다면 수작업으로 테스트하기 힘듦
  2. 프로그램이 프로그램을 테스트할 수 있도록 자동화함
  3. 테스트 환경을 최대한 실제 환경과 비슷하게 흉내냄
  4. 아무리 철저하게 테스트해도 에러를 완전히 막을 수는 없음

테스트를 하면 좋은 점

  1. 하지만 허무한 에러로 인해 프로그램이 고장나는 것은 막을 수 있음
  2. 한 번 발생한 에러는 테스트로 만들어두면 같은 에러가 발생하지 않게 막을 수 있음
  3. 코드를 수정할 때 프로그램이 자동으로 어떤 부분이 고장나는 지 알려줌

Jest 설치하고 실행해보기 (개발용)

npm i –D jest

  1. Nodebird 프로젝트를 그대로 사용함

routes 폴더 안에 middlewares.test.js 작성

  1. 테스트용 파일은 파일명에 testspec이 있으면 됨
  2. npm testtestspec 파일들을 테스트함.
  3. 테스트를 아무것도 작성하지 않았으면 에러 발생(테스트 실패)

 

 

middlewares.test.js 작성하기

  • test 함수의 첫 번째 인수로 테스트에 대한 설명
  • 두 번째 인수인 함수에는 테스트 내용을 적음
  • expect 함수의 인수로 실제 코드를, toEqual 함수의 인수로는 예상되는 결괏값을

  • expecttoEqual의 인수가 일치하면 테스트 통과

 

routers/middlewares.test.js

const { isLoggedIn, isNotLoggedIn } = require('./middlewares');

describe('isLoggedIn', () => {	// 이런식으로 test를 모아둘 수 있음 
  const res = {
    status: jest.fn(() => res),
    send: jest.fn(),
  };
  const next = jest.fn();

  test('로그인 되어있으면 isLoggedIn이 next를 호출해야 함', () => {
    const req = {
      isAuthenticated: jest.fn(() => true),
    };
    isLoggedIn(req, res, next);
    expect(next).toBeCalledTimes(1);
  });

  test('로그인 되어있지 않으면 isLoggedIn이 에러를 응답해야 함', () => {
    const req = {
      isAuthenticated: jest.fn(() => false),
    };
    isLoggedIn(req, res, next);
    expect(res.status).toBeCalledWith(403);
    expect(res.send).toBeCalledWith('로그인 필요');
  });
});

describe('isNotLoggedIn', () => {
  const res = {
    redirect: jest.fn(),
  };
  const next = jest.fn();

  test('로그인 되어있으면 isNotLoggedIn이 에러를 응답해야 함', () => {
    const req = {
      isAuthenticated: jest.fn(() => true),
    };
    isNotLoggedIn(req, res, next);
    const message = encodeURIComponent('로그인한 상태입니다.');
    expect(res.redirect).toBeCalledWith(`/?error=${message}`);
  });

  test('로그인 되어있지 않으면 isNotLoggedIn이 next를 호출해야 함', () => {
    const req = {
      isAuthenticated: jest.fn(() => false),
    };
    isNotLoggedIn(req, res, next);
    expect(next).toHaveBeenCalledTimes(1);
  });
});

1. describe로 테스트 그룹화 가능

 

2. 미들웨어 테스트를 위해 reqres를 가짜로 만들어주어야 함

  • jest.fn으로 함수 모킹 가능

 

3. expect에는 toEqual 말고도 많은 메서드 지원

  1. toBeCalledWith로 인수 체크
  2. toBeCalledTimes로 호출 회수 체크

 

'Node.js' 카테고리의 다른 글

CORS 에러 이해하기  (0) 2021.01.11
API 서버에서 사용량 제한하기  (0) 2021.01.11
Nodejs 호출 서버 만들기  (0) 2021.01.10
Node에서 API 서버 만들기  (0) 2021.01.08
multer 사용해서 이미지 업로드 구현  (0) 2021.01.06