Jasmine spyOn:如何在spyed函数引用传递时使其工作?

时间:2013-10-10 09:34:05

标签: javascript unit-testing jasmine

我正在使用茉莉花测试我的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(); });
它过去了。有没有办法监视传递的这些函数,还是我必须求助于匿名函数案例?

1 个答案:

答案 0 :(得分:1)

是的,有,但为了这样做,在你的功能上添加间谍后必须绑定事件。原因是间谍用另一个函数替换属性(它不会改变函数本身)。在你的情况下,发生的事情是你分配了原始函数,当你添加了间谍时,你替换了属性而没有改变绑定的回调。

如果您的应用程序的制作方式不能在进行事件绑定之前添加间谍,那么唯一可行的就是使用匿名函数来调用正确的回调。