这是窥探Jasmine中某个函数的正确方法吗?

时间:2013-07-27 08:18:32

标签: javascript jasmine

我一直试图监视原来的功能,但我认为我做得不对。

基于the accepted answer of this SO question我写了这个规范:

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();      
    });    
});

现在我的测试通过了。但当我删除行login(user, pass)时,测试失败。我用andCallThrough()链接了间谍。现在我的test.js我在login(user, pass)上呼叫document.ready,因此我猜它正在调用。但我仍然感到困惑的是,我如何能够窥探从login()脚本实际执行的test.js函数。我不认为即使使用andCallThrough()它也会监视login()中存在的test.js。我错过了什么?

1 个答案:

答案 0 :(得分:1)

问题是在document.ready中使用test.js。执行此操作时,测试将立即运行,但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>

现在您可以在测试中调用init函数

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();      
    });    
});