2015-01-07 4 views
1

Jasmine 2의 새로운 done() 콜백을 사용하여 비동기 적으로 설정된 값을 테스트하려고합니다.재스민 비동기 테스트

나는 기반으로 한 재스민 자신의 문서에서 제공하는 예 (http://jasmine.github.io/2.0/upgrading.html#section-Asynchronous_Specs) 후 내 테스트 :

it('can set a flag after a delay', function(done) { 

    var flag = false, 
    setFlag = function() { 
    //set the flag after a delay 
    setTimeout(function() { 
     flag = true; 
     done(); 
    }, 100); 
    }; 

    setFlag(); 
    expect(flag).toBe(true); 
}); 

내가 "진실하게 거짓 예상"결과를 얻고, 그래서 그것의 같은데요 플래그의 값을 검사하기 전에 done() 콜백이 호출되기를 기다리지 않습니다.

누구나이 테스트가 실패한 이유를 알고 있습니까?

감사합니다.

답변

4

setTimeout이 호출되자 마자 주장을 실행하고 있기 때문에 플래그를 true로 설정하는 콜백을 호출 할 시간이 충분하지 않습니다. 아래의 코드는 작동 (이 동작하는 방법을 볼 수 TryJasmine에 아래의 코드를 실행)합니다

describe('flag delays', function() { 
    it('can set a flag after a delay', function(done) { 
    var flag = false, 
    setFlag = function() { 
     //set the flag after a delay 
     setTimeout(function() { 
      flag = true; 
      expect(flag).toBe(true); 
      done(); 
     }, 100); 
    }; 

    setFlag(); 
    }); 
}); 

향후 재스민 테스트 타이머를 촉진하는 waitsFor 방법이있다. 심지어 Sinon.JSfaking times에 대한 기능을 제공하므로 setTimeout 호출을 건너 뛰고 테스트에 기간 기반 종속성을 만들지 않고도 동작을 확인할 수 있습니다. 또한 테스트가 끝나면 질문에 어설 션을 작성할 수 있으므로 가독성이 크게 향상됩니다.

+0

아하겠습니다. 나는 Jasmine 2가 done() 콜백을 기다려야 하는지를보기 위해 expect()에 여분의 권한을 주길 바랬다. 그것은 done()이 다음 테스트로 넘어 가기 전에 호출 될 때까지 기다리라고 지시합니다. 권리? – corbin

+1

Sinon.js는 매우 멋지게 보입니다. 나는 Jasmine.tick을 보았고, setTimeouts도 모의 할 수있는 것처럼 보였다. http://jasmine.github.io/2.0/introduction.html#section-Mocking_the_JavaScript_Timeout_Functions – corbin

+0

@corbin 맞다. 저는이 프레임 워크가 같은 접근법을 지원하기 때문에 모카 테스트에서 사용했습니다. 나의 비동기적인 것들을 위해, 나는 모조 테스트 주자에게 직접 돌아갈 수있는 가짜 타이머들 (나는 며칠 전에 만났다!)과'Promise'를 사용한다. 즉,'done'을 호출 할 필요가 없다는 것을 의미합니다! 나는 카르마가 같은 방식으로 행동하는지 잘 모르겠다. –