2

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

test("FAILS: 处理程序作为回调直接从 jQuery 委托方法调用...", function() {
    var 控制器,
        看法,
        $el,
        C,
        五,
        嘲笑;

    控制器 = 函数() {
        变量自我 = {};

        self.handler = 函数(e){
            console.log("得到处理");
        };

        回归自我;
    };

    视图 = 函数($el,控制器){
        变量自我 = {};

        self.render = 函数() {
            $el.html("");

            $el.delegate("#derp", "keyup", controller.handler);
        };

        回归自我;
    };

    $el = jQuery("");
    c = 新控制器();
    v = 新视图($el, c);
    模拟 = this.mock(c);

    v.render();

    mock.expects("handler").once();

    $el.find("input").val("bar").trigger("keyup");
    相等($el.find(“输入”).val(),“酒吧”);// 通过!

    模拟.验证();
});
test("WINS: 处理程序在匿名函数中被调用...", function() {
    var 控制器,
        看法,
        $el,
        C,
        五,
        嘲笑;

    控制器 = 函数() {
        变量自我 = {};

        self.handler = 函数(e){
            console.log("得到处理");
        };

        回归自我;
    };

    视图 = 函数($el,控制器){
        变量自我 = {};

        self.render = 函数() {
            $el.html("");

            $el.delegate("#derp", "keyup", function(e) {
                控制器.handler(e);
            });
        };

        回归自我;
    };

    $el = jQuery("");
    c = 新控制器();
    v = 新视图($el, c);
    模拟 = this.mock(c);

    v.render();

    mock.expects("handler").once();

    $el.find("input").val("bar").trigger("keyup");
    相等($el.find(“输入”).val(),“酒吧”);// 通过!

    模拟.验证();
});

我在这里做错了吗?

谢谢,

艾琳

4

1 回答 1

0

这是一个经典的回调范围陷阱。函数参数超出范围,因此controller没有handler方法,因为它不是在本地定义的。匿名函数赋予它作用域,因为函数控制 JavaScript 中的作用域。

于 2012-09-06T22:59:30.093 回答