По сути, если вы смоделируете объект, используя 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();
});
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();
});
Я что-то здесь не так делаю?
Спасибо
Erin