본문 바로가기
개발/테스트코드

Jest로 비동기 테스트하기(done)

by 안뇽! 2022. 4. 8.
반응형

우선 calculate.js에 이렇게 적어주자

// calculator.js

const fn = {
  add: (num1, num2) => num1 + num2,
  getName: (callback) => {
    const name = "Mike";
    setTimeout(() => {
      callback(name);

    }, 2000);
  },
};

module.exports = fn;

그리고 테스트코드 calculate.test.js에는 일케 적어주자

import fn from "./calculator";

test(`3초 후에 받아온 이름은 Mike? `, () => {
  function callback(name) {
    expect(name).toBe("Tom");
  	fn.getName(callback);
});

그리고 npm run test를 해보면! 다음과 같이 뜬다.

Tom!== Mike 임에도 불구하고 성공했다는 메시지가 뜬다

시간을 보면 1ms이다.

 

즉 setTimeout이 실행되지 않고 테스트코드가 종료되었기 때문이다.

 

그럼 어떻게 해야할까??

바로 다음과 같이 test코드의 파라미터에 done을 넣어주는 것이다.

이렇게 작성해주면 setTimeout이 실행된 후에 테스트코드가 종료된다.

import fn from "./calculator";

test("0+1은 1이야", () => {
  expect(fn.add(0, 1)).toBe(1);
});

test(`3초 후에 받아온 이름은 Mike? `, (done) => { //done 추가
  function callback(name) {
    expect(name).toBe("Tom");
    done(); //done 추가
  }
  fn.getName(callback);
});

npm run test를 하면 다음과 같은 화면이 나온다.

Tom!==Mike에서 에러가 나고, 5초가 끝난후에 테스트가 종료된다.

Tom을 Mike로 바꿔주면 테스트 통과

import fn from "./calculator";

test("0+1은 1이야", () => {
  expect(fn.add(0, 1)).toBe(1);
});

test(`3초 후에 받아온 이름은 Mike? `, (done) => {
  function callback(name) {
    expect(name).toBe("Mike");//tome 을 mike로 바꿔봄
    done();
  }
  fn.getName(callback);
});

걸린 시간도 2000ms이다.

반응형