Jasmine 으로 비동기 테스트하기


발생일: 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);
    });
  });

});



카테고리

분류 전체보기 (710)
About me. (6)
Daylogs (675)
영어공부 (0)
My works - 추억 (29)
비공개 (0)