2014-12-07 2 views
6

Jasmine 2.1을 사용하고 있습니다. Jasmine 2.1을 사용하여 모듈을 테스트하려고합니다. 내 모듈 중 하나는 코드를 비동기 적으로 실행하는 함수를 가지고 있습니다. 앱 실행이 완료되면 함수의 결과를 테스트해야합니다. 이것을 할 수있는 방법이 있습니까? 현재 내 모듈은 다음과 같습니다 : 나는 다음 내 모듈을 테스트하기 위해 노력하고Jasmine을 사용한 비동기 콜백 테스트

var otherModule = require('otherModule'); 
function MyModule() { 
} 

MyModule.prototype.state = ''; 
MyModule.prototype.execute = function(callback) { 
    try { 
    this.state = 'Executing'; 
    var m = new otherModule.Execute(function(err) { 
     if (err) { 
     this.state = 'Error'; 
     if (callback) { 
      callback(err); 
     } 
     } else { 
     this.state = 'Executed'; 
     if (callback) { 
      callback(null); 
     } 
     } 
    }); 
    } catch (ex) { 
    this.state = 'Exception'; 
    if (callback) { 
     callback(ex); 
    } 
    } 
}; 

module.exports = MyModule; 

:

var MyModule= require('./myModule'); 
describe("My Module", function() { 
    var myModule = new MyModule(); 
    it('Execute', function() { 
    myModule.execute(); 
    expect(myModule.state).toBe('Executed'); 
    }); 
}); 

분명히, 테스트가 실행이 발생하는 대기하지 않습니다. Jasmine을 통해 비동기 실행 함수를 테스트하려면 어떻게해야합니까? 또한 상태 변수를 올바르게 사용합니까? 비동기식 스택에서 길을 잃고 'this'을 사용할 수 있는지 확실하지 않습니다.

답변

8

async section of the jasmine docs을 살펴 보는 것이 좋습니다. 그래서,이 정보를 우리가 같이 아무것도 테스트하기 전에 끝날 때까지 실행을 위해 대기하는 done 콜백을 사용할 수 있습니다

var MyModule= require('./myModule'); 
describe("My Module", function() { 
    var myModule = new MyModule(); 
    it('Execute', function(done) { 
    myModule.execute(function(){ 
     expect(myModule.state).toBe('Executed'); 
     done(); 
    }); 
    }); 
}); 
+0

당신은 우리가'사용 (...)을 기대할 수 있다는 확신 도베을 (... .)'비동기 콜백 내부? –

+0

Jasmine 2.1에서 제대로 작동하는지 확인했습니다. 2.0 이전의 jasmine에서는 비동기 지원이 완전히 다른 것처럼 보입니다. –

+0

@VlasBashynskyi 예, jasmine에 비동기 지원이 추가되었습니다. 'done()'이 호출 될 때까지 기다릴 것이다. (기본적으로 5 초 제한 시간) – Hlung