【发布时间】:2017-05-13 06:34:18
【问题描述】:
我在 javascript 文件中有一个方法。
function foo() {
setTimeout(function() {
bar.getSomeUrl();
},WAIT_FOR_SOMETIME);
}
现在getSomeUrl() 实现如下。
var bar = {
getSomeUrl : function(){
window.location.href = 'someUrl';
return;
},
anotherProp : function() {
return bar.getSomeUrl();
}
};
我正在尝试测试当我调用foo() 方法时会调用getSomeUrl() 方法。
我正在使用 jasmine 进行测试。我的茉莉花测试如下:
describe('This tests getSomeUrl()', function() {
it('is called when foo() is called', function(){
spyOn(bar,'getSomeUrl').and.callFake(function(){});
window.foo();
expect(bar.getSomeUrl).toHaveBeenCalled();
});
});
我并不真正关心测试 getSomeUrl() 内部发生的事情,因为我有一个单独的测试。
我想要测试的是,当我从某个地方调用我的 foo() 时,getSomeUrl() 会被调用。
我有以下问题:
- 如果我这样做,测试会失败,并且在运行所有测试结束时,浏览器会重定向到
someUrl。我没想到会发生这种情况,因为我想既然我在bar.getSomeUrl()上有一个间谍,并且返回了一个fake method,它实际上不会在我调用window.foo()时调用bar.getSomeUrl()。 -
所以我想可能我应该这样做:
expect(window.foo).toHaveBeenCalled();
这没有意义,因为我正在尝试测试是否正在调用 bar.getSomeUrl()。
但是,当我这样做时,测试失败并出现以下错误:
Error: Expected a spy, but got Function.
我还认为可能是 setTimeout 函数导致了问题,并将 foo() 函数更改为:
function foo() {
bar.getSomeUrl();
};
什么都没变
我使用 Jasmine 和 Javascript 才几天,并且对事物的工作原理有了广泛的了解。
非常感谢任何使此测试通过的建议以及关于我做错了什么的指针。
【问题讨论】:
-
它与 java 无关。 Javascript是一个单词拼写的,和Java没有关系。
-
处理好了。谢谢。
-
您有语法错误。
bar.getSomeUrl是一个对象字面量(语法无效)。这不是一个函数
标签: javascript unit-testing jasmine jasmine-jquery