2013-07-27 3 views
0

나는 원래의 기능을 간첩하려고 노력해 왔지만 나는 제대로하지 못하고 있다고 생각한다. 이제이것은 재스민의 기능을 간첩하는 올바른 방법입니까?

testSpec.js

describe("Test:", function() { 
    var user = "foo"; 
    var pass = "bar"; 

    it("Expects login() will be called", function(){ 
     var loginSpy = spyOn(window, 'login').andCallThrough(); 
     login(user, pass); 
     expect(loginSpy).toHaveBeenCalled();  
    });  
}); 

물론 내 테스트 통과 : the accepted answer of this SO question을 바탕으로

나는이 사양을 썼다. 그러나 라인 login(user, pass)을 제거하면 테스트가 실패합니다. 스파이를 andCallThrough()으로 묶었습니다. 이제 내 test.js에서 login(user, pass)document.ready에 전화하고 있으므로 추측됩니다. 그러나 나는 실제로 test.js 스크립트에서 실행되고있는 login() 함수에 대해 간첩을 댈 수있는 방법에 관해 혼란 스럽습니다. 나는 심지어 andCallThrough()으로 생각하지 않는다. login()test.js에 존재한다고 염탐하고있다. 내가 놓치고 있는게 뭐니?

답변

1

문제는 test.js에서 document.ready을 사용하는 것입니다. 이렇게하면 테스트가 즉시 실행되지만 login에 대한 호출은 document.ready 이후에 수행되므로 테스트가 실행 된 후에 호출됩니다. document.ready에 전달 된 함수를 별도로 호출 할 수 있도록 코드를 리팩토링해야합니다. 후

$.ready(function(){ 
    login('foo', 'bar'); 
}) 

:

//init.js 
function init(){ 
    login('foo', 'bar'); 
} 

//index.html 
<script src="init.js"></script> 
<script> 
    $.ready(init) 
</script> 

이제

describe("Test:", function() { 
    var user = "foo"; 
    var pass = "bar"; 

    it("Expects login() will be called", function(){ 
     var loginSpy = spyOn(window, 'login').andCallThrough(); 
     init(); 
     expect(loginSpy).toHaveBeenCalled();  
    });  
}); 
+0

쿨 테스트에 init 함수를 호출 할 수 있습니다 전에

! 깨끗한 솔루션! 감사. +1 –

관련 문제