1

我正在使用 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(); });

它通过了。有没有办法监视传递的这些函数,还是我必须求助于匿名函数案例?

4

1 回答 1

1

是的,有,但要做到这一点,必须在你的函数中添加间谍之后绑定事件。这样做的原因是间谍用其他函数替换了该属性(它不会更改函数本身)。在您的情况下,发生的事情是您分配了原始函数,并且当您添加间谍时,您替换了属性而不更改绑定的回调。

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

于 2013-10-10T14:43:11.847 回答