Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Jasmine spyOn:当spyed函数引用被传递时,如何使其工作?_Javascript_Unit Testing_Jasmine - Fatal编程技术网

Javascript Jasmine spyOn:当spyed函数引用被传递时,如何使其工作?

Javascript Jasmine spyOn:当spyed函数引用被传递时,如何使其工作?,javascript,unit-testing,jasmine,Javascript,Unit Testing,Jasmine,我正在使用jasmine测试我的javascript,我发现一个难以规范的案例。我有一个函数,它直接传递给处理程序: filters.find('#per_page').change(checkList.filter); 现在,我想监视它,看看当我改变它时它是否被调用: describe("when I change the number of items per page", function() { beforeEach(function() spyOn(checkLi

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

它过去了。是否有方法监视传递的此类函数,或者我必须求助于匿名函数案例?

是的,有,但要这样做,必须在您将监视添加到函数后绑定事件。原因是间谍用其他函数替换属性(它不会更改函数本身)。在您的例子中,所发生的是您分配了原始函数,并且在添加spies时,您替换了属性,而没有更改绑定的回调


如果应用程序的生成方式是在执行事件绑定之前无法添加间谍,那么它唯一能起作用的就是使用匿名函数调用适当的回调。

是的,有,但要这样做,必须在您将间谍添加到函数后绑定事件。原因是间谍用其他函数替换属性(它不会更改函数本身)。在您的例子中,所发生的是您分配了原始函数,并且在添加spies时,您替换了属性,而没有更改绑定的回调

如果应用程序的生成方式是,在执行事件绑定之前不能添加间谍,那么它唯一能起作用的就是使用匿名函数调用适当的回调