我一直试图监视原来的功能,但我认为我做得不对。
基于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
。我错过了什么?
答案 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();
});
});