Javascript 用Sinon.js模拟的对象不承认通过jQuery.delegate回调执行了它们的方法

Javascript 用Sinon.js模拟的对象不承认通过jQuery.delegate回调执行了它们的方法,javascript,jquery,unit-testing,mocking,sinon,Javascript,Jquery,Unit Testing,Mocking,Sinon,基本上,如果您使用Sinon.js模拟对象,该对象的属性作为回调传递给jQuery.delegate,那么当您触发jQuery.delegate中观察到的方法时,您的模拟预期将失败。如果您在匿名函数体中执行该方法,该匿名函数体用作jQUery.delegate的回调,您的期望值将通过 test("FAILS: Handler is invoked as callback from jQuery delegate method directly...", function() { var

基本上,如果您使用Sinon.js模拟对象,该对象的属性作为回调传递给jQuery.delegate,那么当您触发jQuery.delegate中观察到的方法时,您的模拟预期将失败。如果您在匿名函数体中执行该方法,该匿名函数体用作jQUery.delegate的回调,您的期望值将通过

test("FAILS: Handler is invoked as callback from jQuery delegate method directly...", function() { var Controller, View, $el, c, v, mock; Controller = function() { var self = {}; self.handler = function(e) { console.log("got handled"); }; return self; }; View = function($el, controller) { var self = {}; self.render = function() { $el.html(""); $el.delegate("#derp", "keyup", controller.handler); }; return self; }; $el = jQuery(""); c = new Controller(); v = new View($el, c); mock = this.mock(c); v.render(); mock.expects("handler").once(); $el.find("input").val("bar").trigger("keyup"); equal($el.find("input").val(), "bar"); // passes! mock.verify(); }); 我做错什么了吗

谢谢


艾琳

这是一个经典的骗局。函数参数超出范围,所以控制器没有处理程序方法,因为它不是本地定义的。匿名函数赋予它作用域,因为函数在JavaScript中控制作用域。

这是一个经典的问题。函数参数超出范围,所以控制器没有处理程序方法,因为它不是本地定义的。匿名函数赋予它作用域,因为函数控制JavaScript中的作用域。

必须同意,如果v2有效,那么v1也应该有效。v1是否也会因实际的键控而失败?当使用.triggerHandlerkeyup进行测试时,v1是否也会失败?必须同意,如果v2工作,那么v1也应该失败。v1是否也会因实际的键控而失败?当使用.triggerHandlerkeyup进行测试时,v1是否也会失败? test("WINS: Handler is invoked inside anonymous function...", function() { var Controller, View, $el, c, v, mock; Controller = function() { var self = {}; self.handler = function(e) { console.log("got handled"); }; return self; }; View = function($el, controller) { var self = {}; self.render = function() { $el.html(""); $el.delegate("#derp", "keyup", function(e) { controller.handler(e); }); }; return self; }; $el = jQuery(""); c = new Controller(); v = new View($el, c); mock = this.mock(c); v.render(); mock.expects("handler").once(); $el.find("input").val("bar").trigger("keyup"); equal($el.find("input").val(), "bar"); // passes! mock.verify(); });