티스토리 뷰
발생일: 2013.05.31
문제:
노드를 사용하는 개인 프로젝트에 테스팅 도구로,
문제:
노드를 사용하는 개인 프로젝트에 테스팅 도구로,
BDD 테스트 프레임워크인 자스민(Jasmine)을 사용하고 있다.
다른 건 괜찮은데 비동기 테스트 부분이 잘 이해가 안된다.
어떻게 하면 될까?
해결책:
아래처럼 `runs`와 `waitsFor`를 활용한다.
describe('', function () {
it('', function () {
runs(function () {
// 비동기 테스트가 필요한 코드를 작성한다.
});
waitsFor(function () {
// 이 함수가 true를 리턴할 때까지 테스트한다.
// 즉, 이 함수는 반복해서 계속 호출된다.
}, '시간이 만료된 경우', 1000);
runs(function () {
// waitsFor의 함수가 true를 리턴하거나, 시간이 만료된 경우
// 다시 이 함수부터 시작한다.
});
});
});
예를 들어,
describe('인기 목록', function () {
it('을 가져올 수 있다.', function () {
var req, data;
runs(function () {
var req = http.request({
host: 'localhost',
port: 3000,
path: '/list/popular',
method: 'GET'
});
req.on('response', function (res) {
res.setEncoding('utf-8');
res.on('data', function (chunk) {
data = JSON.parse(chunk);
});
});
req.end();
});
waitsFor(function () {
return data;
}, '목록이 응답으로 와야 한다.', 500);
runs(function () {
console.log(typeof data);
});
});
});
아래처럼 리팩토링해서 사용하면 편리하다.
var http = require('http');
function request(options, callback) {
var req, data;
runs(function () {
var req = http.request(options);
req.on('response', function (res) {
res.setEncoding('utf-8');
res.on('data', function (chunk) {
data = JSON.parse(chunk);
});
});
req.end();
});
waitsFor(function () {
return data;
}, '응답이 와야 한다.', 500);
runs(function () {
callback(data);
});
}
describe('인기 목록', function () {
it('을 가져올 수 있다.', function () {
request({
host: 'localhost',
port: 3000,
path: '/list/popular',
method: 'GET'
}, function (data) {
console.log(data);
});
});
});
반응형
댓글
공지사항