我正在使用茉莉花测试我的javascript,而且我发现了一个难以规范的案例。我有这个函数直接传递给处理程序:
filters.find('#per_page').change(checkList.filter);
现在,我想监视它,看看当我改变它时它是否被调用:
describe("when I change the number of items per page", function() {
beforeEach(function()
spyOn(checkList, 'filter');
$('#per_page').val('50').trigger('change');
});
it("filters the results list", function() {
expect(checkList.filter).toHaveBeenCalled();
});
});
此测试失败。令人惊讶的是,如果我将上面的代码更改为:
filters.find('#per_page').change(function() { checkList.filter(); });
它过去了。有没有办法监视传递的这些函数,还是我必须求助于匿名函数案例?
答案 0 :(得分:1)
是的,有,但为了这样做,在你的功能上添加间谍后必须绑定事件。原因是间谍用另一个函数替换属性(它不会改变函数本身)。在你的情况下,发生的事情是你分配了原始函数,当你添加了间谍时,你替换了属性而没有改变绑定的回调。
如果您的应用程序的制作方式不能在进行事件绑定之前添加间谍,那么唯一可行的就是使用匿名函数来调用正确的回调。