2012-07-23 4 views
1
내 생산 코드는 커피 스크립트에서 컴파일 로직의 덩어리가

:

results = []; 
results.push(slowOpA()); 
results.push(slowOpB()); 
results.push(slowOpC()); 
results = _.flatten(results); 
$.when.apply($, results).then(onComplete).fail(onError).always(function() { 
    $(document).trigger('stop') 
}); 

것은 내가이 먼저 모든 slowOp * 메소드를 호출 기대를 그런 다음 onComplete 또는 onError을 정확히 한 번 호출하고 마지막으로 always을 정확히 한 번 호출합니다. 때때로

@stopSpy = jasmine.createSpy '<stopSpy>' 
$(document).bind 'stop', @stopSpy 
... 
@lastPromise = new $.Deferred() 
spyOn('slowOpA').andReturn new $.Deferred().resolve() 
spyOn('slowOpB').andReturn new $.Deferred().resolve() 
spyOn('slowOpC').andReturn @lastPromise 
... 
@lastPromise.resolve() 
expect(@stopSpy).toHaveBeenCalledOnce() 

99 100 배 밖으로 작동하지만를하고 대신 2 ~ 3 통화를 가져옵니다 : 그래서 내가 재스민과 테스트 무엇

Expected spy on <stopSpy> to have been called once, but was called '2' times 

내가 뭔가를 놓치고 있습니까? 또는 jQuery/Jasmine에서이 부분이 불분명 한 경쟁 조건입니까?

답변

1

Jasmine에 익숙하지 않지만 JavaScript 코드가 정확합니다. jsFiddle에서 비슷한 것을 조롱했고 예상대로 작동했습니다. 나는 'then (onComplete)'을 'done (onComplete)'과 'then (onComplete, onError)'로 바꾸었지만 모두 예상대로 작동했습니다. slowOpX가 지연/약속을 반환한다고 가정했습니다. Underscore (?) _.flatten (results)은 중복되었지만 문제가 발생할 수 있습니다.

+0

나는 같은 결론을 내 렸습니다. 문제는 코드가 아니라 어떻게 든 출혈하는 것입니다. 우리가 처음 Jasmine이 이런 일을하는 것을 본 적이 없습니다. *한숨* – jpatokal