Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

mocha에서 Promise 테스트 작성하기

JavaScript에서 테스트를 작성할 때 테스트 프레임워크로 mocha를 주로 사용하는 편이다. 특히 Node.js에서는 비동기 작업을 많이 있으므로 테스트에서도 비동기 테스트를 작성해야 하는데 보통 다음과 같이 작성한다.

describe('Example', function() {
  it('should invoke callback', function(done) {
    // given && when
    doAsyncJob(function(err, data) {
      // then
      if (err) { return done(err); }
      // assert data here
      done();
    });
  });
});

위처럼 테스트의 콜백에 done 파라미터를 지정하면 이 테스트는 done이 호출되기 전까지는 테스트가 끝나지 않는다.(done이 호출되지 않으면 타임아웃으로 실패한다.) 꽤 오래전에는 비동기 테스트를 작성하기가 상당히 어려웠는데 done방식을 사용하면 쉽게 테스트를 작성할 수 있다. doneit뿐만 아니라 before, beforeEach, after, afterEach에서도 똑같이 사용할 수 있다.

만약 테스트하는 함수가 콜백 방식이 아니라 Promise를 사용한다면 다음과 같이 테스트를 작성할 수 있다.

describe('Example', function() {
  it('should invoke callback', function(done) {
    doPromiseJob()
      .then(function(data) {
        // assert data here
        done();
      })
      .catch(done);
  });
});

이렇게 작성해도 문제는 전혀 없지만, mocha에서 Promise 테스트를 지원하므로 훨씬 더 간단하게 테스트를 작성할 수 있다.

describe('Example', function() {
  before(function() {
    return doPromiseJob();
  });

  before(function() {
    return doPromiseJob()
      .then(function() {
        return doPromiseJob(); 
      });
  });
});

done을 쓰는 대신 Promise 객체를 반환하면 알아서 Promise.resolvePromise.reject에 따라 테스트를 성공과 실패로 처리해 준다. 이 방식은 작성해 보면 테스트보다는 로직 없이 정리작업을 하는 before, after처럼 테스트 전, 후 작업에 더 편리하다.

describe('Example', function() {
  it('should invoke callback', function() {
    return doPromiseJob().should.eventually.equal("foo");
  });
});

테스트에서 사용하는 경우에는 Promise를 반환할 수 있다면 위처럼 작성할 수 있다. 보통의 assert 라이브러리는 Promise를 지원하지 않으므로 값을 확인해야 하는 경우에는 done 방식을 사용해야 하지만 chai-as-promisedshould-promised처럼 assert 라이브러리에 Promise를 지원하는 라이브러리를 함께 사용해야 위처럼 사용할 수 있다.

2015/04/04 23:29 2015/04/04 23:29