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
방식을 사용하면 쉽게 테스트를 작성할 수 있다. done
은 it
뿐만 아니라 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.resolve
와 Promise.reject
에 따라 테스트를 성공과 실패로 처리해 준다. 이 방식은 작성해 보면 테스트보다는 로직 없이 정리작업을 하는 before
, after
처럼 테스트 전, 후 작업에 더 편리하다.
describe('Example', function() {
it('should invoke callback', function() {
return doPromiseJob().should.eventually.equal("foo");
});
});
테스트에서 사용하는 경우에는 Promise를 반환할 수 있다면 위처럼 작성할 수 있다. 보통의 assert 라이브러리는 Promise를 지원하지 않으므로 값을 확인해야 하는 경우에는 done
방식을 사용해야 하지만 chai-as-promised나 should-promised처럼 assert 라이브러리에 Promise를 지원하는 라이브러리를 함께 사용해야 위처럼 사용할 수 있다.
Comments