2013-09-02 3 views
4

약속을 반환하는 메서드 호출을 테스트하려고하는데 문제가 있습니다. NodeJS 코드에서이 테스트를 실행하려면 Mocha, Chai 및 Sinon을 사용하고 있습니다. 나는 현재이 테스트는 다음과 같습니다Mocha & Sinon을 사용하는 NodeJS의 약속 콜백 테스트

AssertionError: expected spy to have been called exactly once, but it was called 0 times 

약속을 반환하는 방법을 테스트하는 적절한 방법은 무엇입니까 :

it('should execute promise\'s success callback', function() { 
    var successSpy = sinon.spy(); 

    mySpies.executeQuery = sinon.stub(databaseConnection, 'execute').returns(q.resolve('[{"id":2}]')); 

    databaseConnection.execute('SELECT 2 as id FROM Users ORDER BY RAND() LIMIT 1').then(successSpy, function(){}); 

    chai.expect(successSpy).to.be.calledOnce; 

    databaseConnection.execute.restore(); 
}); 

그러나이 시험에 erroring입니까?

답변

7

then() 호출의 핸들러는 현재 테스트 스택 외부에있는 다음 이벤트 루프 동안에 만 등록 중에 호출되지 않습니다.

완성 처리기에서 확인을 수행하고 비동기 코드가 완료되었음을 mocha에 알려야합니다.

    다음 테스트 기능
  • 내에서 확인 및 정리
  • 수행 매개 변수() 핸들러 :

    it('should execute promise\'s success callback', function(done) { 
        mySpies.executeQuery = sinon.stub(databaseConnection, 'execute').returns(q.resolve('[{"id":2}]')); 
    
        databaseConnection.execute('SELECT 2 as id FROM Users ORDER BY RAND() LIMIT 1').then(function(result){ 
        chai.expect(result).to.be.equal('[{"id":2}]'); 
        databaseConnection.execute.restore(); 
        done(); 
        }, function(err) { 
        done(err); 
        }); 
    }); 
    

    변경 원래 코드에 : 그것은 다음과 비슷한 모습이 될 것입니다 또한 http://visionmedia.github.io/mocha/#asynchronous-code

    보기

편집 : 또한, 솔직히 말해서,이 테스트는 코드와 관련하여 아무 것도 테스트하지 않고 코드의 유일한 비트 (databaseConnection)가 스텁 아웃되어 있으므로 약속의 기능을 확인하는 것입니다.

1

나는 그것은 done() 및 모든 넌센스를 실행하는 것보다 훨씬 청소기 구문을 허용 Mocha As Promised

을 확인하는 것이 좋습니다.

it('should execute promise\'s success callback', function() { 
    var successSpy = sinon.spy(); 

    mySpies.executeQuery = sinon.stub(databaseConnection, 'execute').returns(q.resolve('[{"id":2}]')); 

    // Return the promise that your assertions will wait on 
    return databaseConnection.execute('SELECT 2 as id FROM Users ORDER BY RAND() LIMIT 1').then(function() { 
     // Your assertions 
     expect(result).to.be.equal('[{"id":2}]'); 
    }); 

}); 
+0

mocha-as-promised가 이제는 사용이 권장되지 않습니다. Mocha 1.18.0 현재, Mocha에는 약속 된 지원이 내장되어 있습니다! 만세! – arcseldon