jest 비동기 테스팅

2021. 3. 18. 01:08javascript/테스팅

jest 비동기 테스팅

js는 싱글 스레드로 돌아가는 언어로 다양한 주로 비동기 작업들과 함께 사용한다. 

 

Callback

callback 함수를 만들어주어서 등록시켜주며 실행해주면 된다. 하지만 주의해야할 점이 있다. jest의 경우 코드 제일 밑단을 만나버리면 함수가 바로 종료되어 버린다. 

 

js 코드

const hi = {
    add : (num1, num2) => num1 * num2,
    fourSecondAge: callback =>{
        setTimeout(()=>{
            callback(25);
        }, 4000);
    }
}

module.exports = hi;

test 코드

const fn = require("./hi");

test('4초 후에 나이 25', () => {
   const callback = (age) =>{
    expect(age).toBe(25);
   } 

   fn.fourSecondAge(callback);
});

testCode의 경우에는 callback함수를 만들어서 fourSecond에 등록시켜주었다. 

이렇게 테스트를 실행해보면 통과가 나오지만 시간초가 1초만에 종료되게 됩니다. 나는 4초 정도의 setTimeout을 걸어 두었는데 이게 실행되지 않고 종료되어 버린 것이다. 

 

이와 같은 문제를 해결하기 위해서 done을 사용해야한다. 

종료 시간이 5초 정도 진행된 것을 알 수 있다. 그리고 25를 넘겨 주고 toBe까지 비교해서 테스트 결과를 넘겨주게 된다. done을 파라미터로 넘겨 받으면 done이 종료되어야지 테스팅이 마무리 된다. done이 만약에 없다면 5초가 넘어가며 에러가 발생한다. 

 

Promise

Promise에 경우에는 더욱더 편하게 테스팅을 진행할 수 있습니다. 

const hi = {
    add : (num1, num2) => num1 * num2,
    fourSecondAge: () =>{
        return new Promise((res, rej)=>{
            setTimeout(()=>{
                res(25);
            }, 4000);
        });
    }
}

module.exports = hi;

Promise로 코드 변경

 

hi.js 

const hi = {
    add : (num1, num2) => num1 * num2,
    fourSecondAge: () =>{
        return new Promise((res, rej)=>{
            setTimeout(()=>{
                res(25);
            }, 4000);
        });
    }
}

module.exports = hi;

then을 사용해서 res가 반환해주는 값을 받아서 테스팅을 진행해준다. 여기서 중요한건 return을 붙여주어야 한다. 

 

hi.test.js

const fn = require("./hi");

test('4초 후에 나이 25', () => {
   return fn.fourSecondAge().then((num) => {
    expect(num).toBe(25);
   });
});

아래와 같이 편하게 바꿀 수도 있다. 

const fn = require("./hi");

test('4초 후에 나이 25', () => {
   return expect(fn.fourSecondAge()).resolves.toBe(25); // res로 
   return expect(fn.fourSecondAge()).rejects.toBe(25); // rej로
});

 

 

Async/Await


Async/Await위의 js코드를 그대로 두고 testCode에 async await만 달아주면 된다. 

test('4초 후에 나이 25', async () => {
    const age = await fn.fourSecondAge();
    expect(age).toBe(25);
});

 

rej의 경우에는 아래와 같이 바꿀 수 있다.

const fn = require("./hi");

test('4초 후에 나이 25', async () => {
    try{
        const age = await fn.fourSecondAge();
        expect(age).toBe(25);
    }catch(e){
        expect(e).toBe(25);
    }
});