2013-05-03 3 views
1

인턴에서 asyn 콜백을 호출해야하는 상황을 지정할 수 있습니까? 우리는 여러 XHR 요청을 연속적으로 수행하는 테스트 방법을 테스트한다고 가정 해 봅시다. 구체적으로 Strophe.connect에 제공된 콜백 구현을 테스트하려고합니다. 그것은 초기 XMPP (BOSH) 핸드 셰이크를 처리하는 서버에 여러 XHR 요청을 보내는 방식으로 작동합니다.인턴 asyn 콜백을 두 번 이상 호출하십시오.

5 초 후에 상태 코드 5 (연결됨)로 콜백이 호출되는지 테스트 할 수 있습니까? 문제는 콜백이 두 번 이상 트리거되고 올바른 상태 코드를 기다려 다른 것들을 버려야한다는 것입니다.

var dfd = this.async(5000); 

conn.connection.connect("jid", "pass", dfd.callback(function(status) { 
    if(status === 5) { 
     expect(status).to.have(something); 
    } else { 
     // here, I need to say intern to 
     // do nothing, just let the callback 
     // to be triggered once more 
    } 
    return true; 
})); 

답변

1

는 콜백이 두 번 이상 호출되는 것이기 때문에, 나는 명시 적으로는 dfd.callback에 콜백을 포장하기보다는 연기 해결을 건의 할 것입니다. 이런 식으로 뭔가를 시도 :

var dfd = this.async(5000); 

conn.connection.connect('jid', 'pass', dfd.rejectOnError(function (status) { 
    if (status !== 5) { 
     return; 
    } 

    // do any assertions here 

    // explicitly resolve the test since it was successful to this point 
    dfd.resolve(); 
})); 

첫째, 우리가 dfd.rejectOnError로 콜백을 감싸 알 수 있습니다. 이 편리한 메소드는, 콜백 함수의 실행 중에 Error가 Throw되었을 경우, 지연을 거부합니다. 다음으로, 우리는 dfd.callback을 없앴습니다. 래핑 된 콜백이 Error를 throw하지 않고 실행되면 지연 문제를 해결하려고 시도합니다. 콜백은 여러 번 호출되기 때문에 작동하지 않습니다. 귀하의 기준 (status !== 5 및 어설 션 패스)이 충족 될 때만 지연을 명시 적으로 해결하면 지연이 5 초 이내에 해결되는 한 콜백이 여러 번 실행될 수 있습니다.

+1

감사합니다. 정확하게이 문제를 해결합니다! –

관련 문제