[javascript] Jasmine에서 비동기 코드를 테스트하는 방법

Jasmine은 JavaScript를 위한 테스트 프레임워크입니다. 비동기 코드를 테스트하는 것은 일반적인 테스트에서 주의를 기울여야 하는 부분입니다. 이 글에서는 Jasmine에서 비동기 코드를 테스트하기 위한 몇 가지 방법을 살펴보겠습니다.

1. done 매개변수 사용하기

Jasmine에서 비동기 코드를 테스트하기 위해 가장 간단한 방법은 done 매개변수를 사용하는 것입니다. done 매개변수는 테스트 함수에 전달되며, 비동기 작업이 완료되었을 때 호출되어야 합니다. 예를 들어, 다음과 같은 비동기 함수를 테스트한다고 가정해봅시다:

function fetchData(callback) {
  setTimeout(function() {
    callback('data');
  }, 1000);
}

이 함수를 테스트하기 위해서는 done 매개변수를 사용하여 테스트가 끝날 때까지 기다려야 합니다. Jasmine에서는 done 매개변수가 호출되기 전까지 테스트가 완료되지 않습니다:

describe('fetchData', function() {
  it('should return data', function(done) {
    fetchData(function(result) {
      expect(result).toBe('data');
      done();
    });
  });
});

위의 예제에서 done 함수가 expect 함수 뒤에 호출되는 것을 볼 수 있습니다. 이렇게 함으로써 테스트가 비동기 코드가 완료될 때까지 기다리게 됩니다.

2. async/await 사용하기

Jasmine 3부터 비동기 코드를 테스트하기 위해 async/await 문법을 사용할 수 있습니다. 이를 사용하면 비동기 코드를 작성한 것처럼 비동기 테스트를 작성할 수 있습니다. 위에서 예시로 든 fetchData 함수를 async 함수로 변경하면 다음과 같습니다:

function delay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function fetchData() {
  await delay(1000);
  return 'data';
}

이제 async 함수를 사용하여 테스트를 작성할 수 있습니다. Jasmine에서는 async 함수 앞에 await를 사용하여 비동기 코드가 완료될 때까지 기다릴 수 있습니다:

describe('fetchData', function() {
  it('should return data', async function() {
    const result = await fetchData();
    expect(result).toBe('data');
  });
});

위의 예제에서는 테스트 함수의 정의 앞에 async 키워드가 사용되었고, 비동기 코드 앞에 await 키워드가 사용되었습니다. 이렇게 함으로써 Jasmine은 await 키워드 뒤에 오는 비동기 코드가 완료될 때까지 기다립니다.

결론

Jasmine에서 비동기 코드를 테스트하는 방법에 대해 살펴보았습니다. done 매개변수를 사용하는 방법과 async/await 문법을 사용하는 방법을 알아보았습니다. 어떤 방법을 선택하든, 비동기 코드를 테스트할 때 주의하고 각 테스트가 완료될 때까지 적절하게 기다려야 합니다. 추가적인 정보는 Jasmine의 공식 문서를 참조하시기 바랍니다.

참고 자료