2011-12-25 4 views
1

비동기 함수를 맹세와 인터리빙 (테스트)하는 방법이 있습니까? 예를 들어맹세 : 비동기 인터리빙 테스트

:

// Topic portion 
var user = new User('jacob') 
user.set('email,'[email protected]') 
user.save() // a 
user.set('email',[email protected]') 
user.save() // b 
user.refresh(this.callback) // Reload from database 

// Callback 
assert.equals(user.email,'[email protected]') 

이 두 저장 사이의 경쟁 조건이 될 수있다. 테스트를 작성할 때 API가 b 단계가 마지막으로 이루어 졌음을 보증하고 이메일의 올바른 최종 값을 갖고 있는지 확인하고자합니다. 그것이 작성된 방법으로, 테스트는 동시에 우연히 통과 할 것입니다. 서약 워드 프로세서에서 Heres는

+0

은'저장() '함수에 대한 콜백이 있습니까? – fent

답변

1

예는 :

중첩 상황은 중첩 콜백 행동 다음 콘텍스트 리턴 인자를 전달.

문서 : http://vowsjs.org/

{ topic: function() { 
    fs.stat('~/FILE', this.callback); 
    }, 
    'after a successful `fs.stat`': { 
    topic: function (stat) { 
     fs.open('~/FILE', "r", stat.mode, this.callback); 
    }, 
    'after a successful `fs.open`': { 
     topic: function (fd, stat) { 
     fs.read(fd, stat.size, 0, "utf8", this.callback); 
     }, 
     'we can `fs.read` to get the file contents': function (data) { 
     assert.isString (data); 
     } 
    } 
    } 
} 
+0

이것은 실제로 내가 원하는 것과 반대입니다. 필자는 실제로 테스트 코드를 명시 적으로 강제로 동기식으로 작성하지 않고 내 경쟁 조건이 발생하지 않도록 테스트하고 싶습니다. 목표는 API를 투명하게 만드는 것입니다. 그러나 어쨌든 이것은 노드에 영향을 줄 것입니다. 요점은, 저장()을 장면 뒤에 대기시키고 싶습니다. – Koobz

+0

이것은 경쟁 조건을 제거합니다. 콜백을 사용하면 시퀀스의 바람직하지 않은 타이밍을 제거 할 수 있습니다. 잠재적으로 비순차 방식으로 실행될 수있는 병렬 코드를 게시 할 수 있습니다. –

+0

클라이언트 측 코드에서 경쟁 조건을 수정하도록 서버를 강요하려는 것처럼 들리지만 클라이언트와 서버 사이의 대기 시간 특성으로 인해 불가능합니다. 이 올바른지? –

관련 문제