2009-06-30 10 views
88

Je suis bloqué par un problème lors du test de mes contrôleurs avec RSpec - l'appel response.body renvoie toujours une chaîne vide. Dans le navigateur, tout se passe correctement, et les tests de fonctionnalité de concombre semblent bien faire, mais RSpec échoue à chaque fois.Test du contrôleur RSpec - réponse vide.body

D'autres attentes sur l'objet de réponse, telles que response.should render_template('index') passent sans problème.

L'un d'entre vous a-t-il déjà rencontré ce problème? Peut-être que la réponse html peut être obtenue d'une autre manière?

Comme pour les versions, Rails 2.1.0, RSpec 1.2.7.

Répondre

166

Par défaut, rspec-rails hacks dans Rails à empêche de rendre réellement les modèles de vue. Vous devriez seulement tester le comportement de vos actions. & filtre vos tests de contrôleur, pas le résultat du rendu de modèle - c'est ce à quoi servent les spécifications de vue.

Toutefois, si vous souhaitez faire les spécifications de votre contrôleur render modèles comme l'application normalement, utilisez la directive render_views:

describe YourController do 
    render_views 
    ... 
end 
+2

Merci, exactement ce dont j'avais besoin. –

+1

Je travaille avec Rails depuis des années et maintenant je comprends enfin la différence entre les spécifications de contrôleur et de demande. Merci! –

2

Comme je l'ai travaillé avec un problème similaire (qui m'a conduit à cette question), il m'est venu à l'esprit qu'il existe différentes façons de peler le même chat. En d'autres termes, plutôt que de vérifier le corps du texte, vous pourrez peut-être vérifier le contenu du flash.

response.body.should =~ /Invalid email or password/ 

pourrait être un chèque équivalent à:

flash[:alert].should == "Invalid email or password" 

Pour moi, ce dernier semble un peu plus souple, car il fonctionnera de toute façon, mais il peut ne pas être appropriée dans tous les cas.

Cheers,

John

0

Par défaut, la configuration RSpec rails désactive le rendu de modèles pour les spécifications du contrôleur

Une des façons de résoudre ce problème est en veillant à activer le paramètre render_views dans votre fichier rails_helper.rb. De cette façon, vous le faites fonctionner globalement dans tous vos tests.

RSpec.configure do |config| 
    config.render_views 
end 

Ou utilisez la déclaration render_views un groupe individuel:

describe User do 
    render_views 
end 

Vous pouvez en savoir plus sur ce here.

Questions connexes