0

我一直试图窥探原始功能,但我认为我做得不对。

基于这个 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。我有什么遗漏吗?

4

1 回答 1

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();      
    });    
});
于 2013-07-27T08:48:32.883 回答