2012-11-26 3 views
1

J'exécute une méthode dans la méthode d'initialisation View Backbone.Sinon, la méthode espion appelée dans la vue backbone initialize

initialize : function(options) { 
     this.myMethod(); 
    } 

Je suis en train d'espionner cette méthode en utilisant comme sinon:

this.spyMyMethod = sinon.spy(this.view, "myMethod"); 

fin puis

it('should call my method', function(){ 
    expect(this.spyMyMethod).toHaveBeenCalledOnce(); 
}); 

mais le test échoue ...

Toutes les idées?

Répondre

3

Vous espionnez la méthode trop tard.

Lorsque vous affectez this.view, je suppose qu'il s'agit d'un appel comme new Views.SomeView(). C'est cet appel new qui fera la fonction initialize être exécutée.

Mise à jour

Je ne recommande pas vraiment faire cela parce qu'il est assez désordonné, mais vous pouvez peut-être faire quelque chose comme ce qui suit: (Je ne sais pas, mais c'est sinon comment vous le feriez avec les objets d'espionnage de jasmin de base)

it('should call my method', function(){ 
    var dummyView = new Views.SomeView(); 
    spyOn(dummyView, "myMethod"); 
    spyOn(Views, "SomeView").andCallFake(function() { 
    dummyView.initialize(); 
    return dummyView; 
    }); 
    new Views.SomeView(); 
    expect(dummyView.myMethod).toHaveBeenCalled(); 
}); 

autre Possiblilty

il semble que cela pourrait être possible de remplacer cette méthode avec comme py comme ci-dessous. Si cela fonctionne, c'est probablement le moyen le plus propre de le faire.

it('should call my method', function(){ 
    spyOn(Views.SomeView.prototype, "myMethod"); 
    new Views.SomeView(); 
    expect(Views.SomeView.prototype.myMethod).toHaveBeenCalled(); 
}); 
+1

Y a-t-il un moyen d'espionner plus tôt? Peut-être espionner le prototype de Backbone.View? – chchrist

+0

Peut-être. Essayez quelque chose comme ce que j'ai ajouté. Je ne recommande pas vraiment cela. Il commence à devenir méchant et ne vous donnera peut-être pas grand-chose en matière de test. –

+1

Le deuxième exemple fonctionne comme charme. Merci! – chchrist

0

Vous devez retourner une nouvelle instance de votre vue pour la méthode initialize à appeler.

Je ne sais pas si this.view = new View(); déjà cependant

+0

Bonjour, je crée une nouvelle instance avec le nouveau – chchrist

Questions connexes