Test du contrôleur RSpec - réponse vide.

103

Je suis coincé avec 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 s'affiche correctement et les tests de fonctionnalités de concombre semblent bien faire les choses, mais RSpec échoue à chaque fois.

D'autres attentes sur l'objet de réponse, telles que response.should render_template('index')passer sans aucun 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?

Quant aux versions, Rails 2.1.0, RSpec 1.2.7.

Toms Mikoss
la source

Réponses:

194

Par défaut, rspec-rails pirate Rails pour l' empêcher de rendre réellement les modèles de vue. Vous ne devriez tester que le comportement de vos actions et filtres vos tests de contrôleur, pas le résultat du rendu du modèle - c'est à cela que servent les spécifications de vue.

Cependant, si vous souhaitez que les spécifications de votre contrôleur rendent les modèles comme le ferait normalement l'application, utilisez la render_viewsdirective:

describe YourController do
  render_views
  ...
end
mislav
la source
2
Merci, exactement ce dont j'avais besoin.
Toms Mikoss
2
Je travaille avec Rails depuis des années et maintenant je comprends enfin la différence entre le contrôleur et les spécifications de demande. Merci!
Brian Underwood
2

Alors que je travaillais avec un problème similaire (qui m'a conduit à cette question), il m'est venu à l'esprit qu'il existe différentes façons d'écorcher 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 une vérification équivalente à:

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

Pour moi, ce dernier semble un peu plus flexible car il fonctionnera dans les deux sens, mais il peut ne pas être approprié dans tous les cas.

À votre santé,

John

John Lockwood
la source
2

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

L'un des moyens de résoudre ce problème consiste à activer le render_viewsparamètre dans votre rails_helper.rbfichier. De cette façon, vous le rendez capable de fonctionner globalement dans tous vos tests.

RSpec.configure do |config|
  config.render_views
end

Ou utilisez la déclaration render_views pour un groupe individuel:

describe User do
  render_views
end

Vous pouvez en savoir plus ici .

Nesha Zoric
la source