2012-03-25 1 views
2

Fondamentalement, si vous vous moquez d'un objet en utilisant Sinon.js qui a une propriété qui est passée en rappel à jQuery.delegate vos attentes fictives échoueront lorsque vous déclenchez la méthode observée dans jQuery.delegate. Si vous exécutez la méthode à l'intérieur du corps d'une fonction anonyme que vous utilisez comme callback de jQuery.delegate vos attentes passeront.Objets mockés avec Sinon.js ne reconnaissent pas avoir leurs méthodes exécutées via un rappel 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(); 
}); 

que je fais quelque chose qui cloche?

Merci,

Erin

+0

Doit être d'accord, si v2 fonctionne alors v1 devrait aussi. Est-ce que v1 échoue également avec un keyup réel? La v1 échoue-t-elle également lorsqu'elle est testée avec '.triggerHandler (" keyup ")'? –

Répondre

0

C'est un callback scope classique Gotcha. Les arguments de fonction sont hors de portée, donc controller n'a pas de méthode handler car elle n'est pas définie localement. La fonction anonyme lui donne une portée car les fonctions contrôlent la portée en JavaScript.

Questions connexes