본문 바로가기
Testing/Jest

Jest: 비동기 코드 테스트하기

by 코딩쥐 2024. 9. 11.

비동기 코드를 테스트를 할 경우 로직이 완료되기 전에 테스트가 시행되기 때문에 정확한 테스트 결과값을 얻을 수 없다. 이에 Jest에서도 비동기 코드를 테스트 할 수 있는 몇 가지 방법을 제공한다. 

 

콜백함수 방식

Jest에서 done이라는 argument를 사용하게 되면 콜백 함수가 완료될 때까지 기다린 후에 테스트를 진행한다.

// fn.js
// 3초 뒤에 콜백함수를 호출하는 로직
const fn = {
    getName: callback => {
        const name = "codingji";
        setTimeout(() => {
            callback(name);
        }, 3000); 
    }
}

module.exports = fn;
//fn.test.js
const fn = require("../fn");

describe("콜백 함수 예제확인", () => {
  test("3초 뒤에 받은 이름이 codingji 맞다.", (done) => {
    function callback(name) {
      try {
        expect(name).toBe("codingji"); // 이름이 "codingji"인지 확인
        done(); // 테스트 완료
      } catch (error) {
        done(error); // 에러 발생 시 done()에 에러 전달
      }
    }
    fn.getName(callback); // getName 호출, 콜백 전달
  });
});

 

아래 예제를 확인하면 3초가 지난 다음에 테스트가 진행된 것을 볼 수 있다.

 

Promise 방식

Promise는 기존의 콜백함수에 추가적으로 resolves와 rejects를 활용하여 더 간단하고 쉽게 테스트를 시행할 수 있다. 주의할 점은 반드시 return문을 사용해야 한다. 

// fn.js
const fn = {
    getName: (isFail) => {
        const name = "codingji";
        
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                if (isFail) {
                    reject("error"); //isFail이 true일 경우 reject 전달
                } else {
                    resolve(name); //isFail이 false일 경우 resolve 전달
                }
            }, 3000);
        });
    }
}

module.exports = fn;
// fn.test.js
const fn = require("../fn");

describe("Promise 예제 확인", () => {
  // test("3초 뒤에 받는 이름이 codingji다.", () => {
  //   return fn.getName(false).then((name) => {
  //     expect(name).toBe("codingji");
  //   })}); ==> 해당 코드를 아래의 resolves로 줄여 사용 가능하다. 
  
  test("3초 뒤에 받는 이름이 codingji다.", () => {
  //return문 반드시 사용
    return expect(fn.getName(false)).resolves.toBe("codingji"); // 성공 테스트
  });

  test("3초 뒤에 'error'를 받아온다.", () => {
    return expect(fn.getName(true)).rejects.toBe("error"); // 실패 테스트
  });
});

 

Async / await 방식

async / await 방식은 테스트 함수 맨 앞에 async를 작성하고, Promise를 리턴하는 함수 앞에 await를 붙여주면 된다. 이 방식의 경우 복잡한 로직 (여러 개의 비동기 호출이 있을 때 등)에서 사용하면 보다 더 가독성이 좋은 테스트 코드를 작성할 수 있다. 

// fn.test.js
const fn = require("../fn");

describe("Promise 예제 확인", () => {
  test("3초 뒤에 받는 이름이 codingji다.", async () => {
    // 비동기 함수를 동기화 해서 받음
    expect(await fn.getName(false)).toBe("codingji");
  });

  test("3초 뒤에 'error'를 받는다.", async () => {
    try {
      await fn.getName(true); // 에러를 발생시키고
    } catch (error) {
      expect(error).toBe("error"); // 해당 하는 에러메시지를 테스트한다.
    }
  });
});

 

'Testing > Jest' 카테고리의 다른 글

Jest: Only와 Skip 사용해보기  (0) 2024.09.18
Jest : Matcher에 대해서  (1) 2024.09.18
Jest: Mock Function에 대해서  (0) 2024.09.11
Jest : 테스트 전 후 작업 설정하기  (0) 2024.09.11
Jest 사용하기  (0) 2024.09.10