DEV Community

wes5510
wes5510

Posted on • Edited on

NodeJS에서의 Jest Cheat Sheet

이 포스트에 방문해주셔서 감사합니다.
포스트에 대한 비판, 의견, 공감하는 피드백은 언제나 환영입니다.

  • 모듈의 함수 mocking

    doSomething1() 함수를 테스트해야할 때, ctrl.jsdoSomething1()함수가 같은 모듈의 doSomething2()함수를 호출하고 있다면 아래와 같이하면 된다.

    • ctrl.js

      exports.doSomething1 = (a) => {
          ...
          const result = exports.doSomething2();
      };
      
    • ctrl.test.js

      jest.fn()이 있지만 jest.spyOn()을 사용하면 모듈이 유무까지 확인할 수 있다.

      const ctrl = require('./ctrl');
      
      describe('ctrl', () => {
          afterEach(() => {
              // spyOn를 이용해서 만든 mock 함수가 
              // 다른 test에 영향이 가지 않도록
              // 원래 모듈로 초기화
              jest.restoreAllMocks();
          });
          describe('doSomething1', () => {
              test('...', () => {
                  const doSomething2Mock = jest
                      .spyOn(ctrl, 'doSomething2')
                      .mockReturnedValue(1);
                  const ret = ctrl.doSomething1();
                  ...
              });
          });
      });
      
  • 모듈의 변수 mocking

    module1.jsPREFIX변수를 mocking하면 아래와 같이 할 수 있다.

    • module1.js

      exports.PREFIX = 'pre';
      exports.doSomething = a => `${exports.PREFIX}_${a}`;
      
    • module1.test.js

      describe('module', () => {
          describe('doSomething', () => {
              let oriPrefix;
      
              beforeAll(() => {
                  oriPrefix = module1.PREFIX;
              });
      
              afterAll(() => {
                  module1.PREFIX = oriPrefix;
              });
      
              test('test', () => {
                  module1.PREFIX = '1';
                  ...
              });
          });
      });
      
  • 비동기(Async/Await) 함수 테스트

    ctrl.js의 비동기 함수인 doSomething()를 테스트할 때 아래와 같이 하면된다.

    • ctrl.js

      exports.doSomething = async () => {...};
      
    • ctrl.test.js

      const ctrl = require('./ctrl');
      
      describe('ctrl', () => {
          describe('doSomething', () => {
              test('...', async () => {
                  const result = await ctrl.doSomething();
                  ...
              });
          });
      });
      
  • 콜백 함수(res.json(), ...) 테스트

    콜백 함수가 포함된 ctrl.jsdoSomething()함수를 테스트할 때 아래와 같이 하면된다.

    • ctrl.js

      exports.doSomething = (e) => {
          e.on('stop', () => {
              ...
          });
      };
      
    • ctrl.test.js

      const ctrl = require('./ctrl');
      
      describe('ctrl', () => {
          describe('doSomething', () => {
              test('...', done => {
                  const e = {
                      on: jest.fn(() => {
                          ...
                          done();
                      });
                  };
                  ctrl.doSomething(e);
              });
          });
      });
      
  • throw new Error() 테스트

    ctrl.jsdoSomething()함수가 에러를 throw 하는 지 확인할 때 아래와 같이 하면된다.

    • ctrl.js

      exports.doSomething = () => {
          throw new Error('?');
      };
      
    • ctrl.test.js

      const ctrl = require('./ctrl');
      
      describe('ctrl', () => {
          describe('doSomething', () => {
              test('...', () => {
                  expect(() => ctrl.doSomething()).toThrow(Error);
              });
          });
      });
      

    doSomething()함수가 비동기일 경우 에러를 throw하는 지 확인할 때는 아래와 같이 하면된다.

    • ctrl.js

      exports.doSomething = async () => {
          ...
          throw Error('?');
      };
      
    • ctrl.test.js

      const ctrl = require('./ctrl');
      
      describe('ctrl', () => {
          describe('doSomething', () => {
              test('...', async () => {
                  await expect(ctrl.doSomething()).toThrow(Error);
              });
          });
      });
      

Top comments (0)