2010-12-13 3 views
1

Je déplace une méthode d'un contrôleur dans un assistant; la méthode sera maintenant appelée depuis la vue. Auparavant, dans mon contrôleur j'avaisComment ajouter une attente moka qu'une méthode d'assistance sera appelée?

def show 
    @things = gather_things 
end 

et dans mon test fonctionnel j'avais

test "show assigns things" do 
    get :show 
    assert_equal GATHERED_THINGS, assigns(:things) 
end 

maintenant, gather_things vie dans l'aide et est appelé de la vue. J'ai un test unitaire pour l'assistant qui s'assure qu'il renvoie les bonnes valeurs, mais je veux que mon test fonctionnel affirme qu'il est appelé. J'ai essayé

test "show calls gather_things" do 
    @controller.expects(:gather_things) 
    get :show 
end 

mais cela ne fonctionne pas. Que dois-je faire pour appeler expects(:gather_things)?

Répondre

1

Si vous avez déplacé le code du contrôleur dans une vue, il est en fait sorti du champ du test fonctionnel.

Je ne connais pas la bonne classe pour mettre vos attentes sur ... mais vous pouvez probablement comprendre par, dans la méthode "gather_things" faire quelque chose comme: logger.error self.class.name - qui va cracher le nom de la classe dans le Connectez-vous pour vous. Ensuite, vous pouvez mettre vos attentes sur cette classe.

Maintenant, nous arrivons au cœur de la question ... Si vous avez déplacé ce code dans la vue?

Mon opinion est que vous ne devriez pas. La configuration d'un rassemblement d'objets-modèles est précisément ce qui est supposé aller dans le code du contrôleur - que se passe-t-il si vous décidez ultérieurement d'afficher les mêmes données dans un fichier CSV ou dans une API XML RESTful? - vous avez toujours besoin du même ensemble d'objets instancié, quelle que soit la vue que vous utilisez. Donc, ma recommandation ultime serait de déplacer cette méthode dans le contrôleur là où elle appartient.

Edit: Voici maintenant des conseils obsolètes et non pertinents à cet utilisateur, mais peut-être à d'autres

Si vous testez à l'aide rspec - il doesn't actually render the views during a functional test (à moins que vous mettez spécifiquement que sur), et donc un code appelé les vues de formulaire ne seront pas exécutées.

Si vous voulez tester que la vue appelle quelque chose, vous devrez l'activer ou la tester dans vos tests de vue.

+0

Nous utilisons Test :: Unité et amis plutôt que spec. – Simon

+0

Ok, j'ai ajouté un moyen de déterminer à quelle classe il est appelé. Je recommande toujours de rappeler le contrôleur, pour les raisons indiquées. –

Questions connexes