Объекты, созданные с помощью Sinon.js, не подтверждают, что их методы выполнялись с помощью обратного вызова jQuery.delegate. - PullRequest
2 голосов
/ 25 марта 2012

По сути, если вы смоделируете объект, используя 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

1 Ответ

0 голосов
/ 07 сентября 2012

Это классическая область обратного вызова .Аргументы функции находятся вне области видимости, поэтому controller не имеет метода handler, поскольку он не определен локально.Анонимная функция дает ей область действия, потому что функции управляют областью действия в JavaScript.

...