2013-05-03 4 views
3

인턴 테스트 프레임 워크에서 비동기 테스트가 어떻게 작동합니까? 예제와 똑같이 실행하려고 시도했지만 비동기 테스트는 콜백이 실행될 때까지 기다리지 않고 바로 전달됩니다.인턴에서 비동기 테스트가 어떻게 작동합니까?

it('should connect in 5 seconds', function() { 
    var dfd = this.async(5000); 
    conn.connect(credentials, dfd.callback(function(result) { 
     expect(result).to.... something 
    })); 
} 

테스트가 즉시 완료됩니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

콜백 _is_이 예상대로 호출되고 콜백 내의 어설 션이 발생하기 때문에 테스트가 통과 한 것일 수 있습니까? 콜백이 호출되지 않았 음을 확인한 것 같습니다. 그냥 생각. – bitpshr

+0

음,'conn.connect'는 비동기 요청을 수행해야하지만 콜백은 XMLHttpRequest가 발생하기 전에 트리거됩니다. –

+0

글쎄, 나는 연결이 설정되기 전에 콜백이 발생했다는 것을 알아 냈다. 그러나'result' 변수는 상태를 유지하므로 상태가 일정한 값일 때만 검사해야합니다. '내 사건이 아니고, 다른 결과를 쳤을 때 다시 콜백을 부르는 것'과 같은 말을 할 수 있습니까? –

답변

5

dfd.callback 자체가 실행될 때까지 아무 것도 실행하지 않습니다. 인수가 오류 일 수있는 Node.js 스타일 콜백 (예 : function (error, result) {})이 아닌 약속 콜백 (예 : promise.then에 전달 된 함수) 용으로 설계되었습니다. 인수로 오류가 전달되었는지 확인하지 않습니다.

무엇이 conn인지 알지 못하지만, 약속이 아예없는 것에 대한 인수로 dfd.callback을 전달하는 방법을 본다면 의심 스럽습니다. Node.js 스타일 콜백을 사용하려고 시도 중이며 호출이 즉시 오류가 발생하고 있습니다. 우리는 약속 인터페이스로 변환 할 수있는 미래에 콜백 이러한 유형의 간이 래퍼를 제공 할 수 있지만, 그때까지, 당신은 아마 같은 것을 수행해야합니다 conn이 무엇인지 모른 채,

it('should connect in 5 seconds', function() { 
    var dfd = this.async(5000); 
    conn.connect(credentials, dfd.callback(function(error, result) { 
     if (error) { 
      throw error; 
     } 

     expect(result).to.... something 
    })); 
}); 

그렇지 않으면를 당신의 실제 주장이 무엇인지 보면서,이 문제가 무엇인지 말하기는 너무 어렵습니다. 콜백 내부의 아무 것도 오류를 throw하지 않는 한 테스트는 성공한 것으로 간주됩니다.

편집 : 위의 사용자 의견에 따르면 콜백은 다른 정보를 여러 번 호출하는 이벤트 수신기입니다. 이 경우, 당신이 할 수있는 것은이 같은 것입니다 : 자동으로 약속 해결되지 않는 단지를 제외하고 dfd.callback 같은

it('should connect in 5 seconds', function() { 
    var dfd = this.async(5000); 
    conn.connect(credentials, dfd.rejectOnError(function (result) { 
     if (result !== 'what I want') { 
      return; 
     } 

     expect(result).to.... something 
     // all other tests… 

     // nothing threw an error, so it is a successful test 
     dfd.resolve(); 
    })); 
}); 

dfd.rejectOnError 작품; 너는 결국 너 자신을 그렇게 해.

+0

답변 해 주셔서 감사합니다! 위의 내 의견을 참조하십시오 - 거기에 문제를 설명합니다. –

1

구조는 괜찮습니다. dfd은 테스트가 성공하기 위해 5 초의 시간 제한을 설정 한 다음 즉시 인턴 프레임 워크의 일부가 아닌 conn.connect()을 시도합니다. 간단한 XHR 요청을 시도하는 경우 getUrlCallback 함수를 대신 사용해보십시오.

그들은이 URL에서 테스트의 아주 멋진 목록을 가지고 있습니다 : https://github.com/theintern/intern/wiki/Writing-Tests. 두 개의 비동기 예제를 찾으십시오.