4 votes

Action de contrôleur bloquée dans le test de contrôleur Rspec, mais toujours exécutée

J'aimerais tester si une action du contrôleur est réellement appelée sans qu'une redirection ne se produise dans un certain before_filter. Puisque l'action du contrôleur elle-même peut faire une redirection, je veux bloquer l'action pour qu'elle lève une erreur spécifique (SuccessfulActionError ou similaire) et ensuite vérifier cette erreur comme indicateur que la méthode a été appelée.

J'ai donc ajouté ce qui suit :

controller.stub!(:action).and_raise(SuccessfulActionError)

Il fonctionne d'une manière ou d'une autre l'exception est levée, mais le code de la méthode est toujours exécuté (par exemple, si j'envoie l'identifiant d'un enregistrement inexistant à l'action "show", une exception ActiveRecord::RecordNotFound est levée).

Comment cela se fait-il ? Je veux complètement bloquer l'action comme si elle était implémentée en tant que

def action
  raise SuccessfulActionError
end

Qu'est-ce que je fais de travers ? Est-ce la mauvaise approche ?

EDIT :

Utilisation

controller.should_receive(:action)

ne fonctionne pas non plus.

J'écrase le contrôleur dans un filtre before_all comme celui-ci pour corriger les options default_url_ qui ne sont pas prises en compte par l'ApplicationController :

class MyController
  def default_url_options(options = {})
    { :locale => params[:locale] }
  end
end

Cela pourrait-il être le coupable ? Les spécifications ne fonctionnent pas du tout lorsque je l'enlève malheureusement.

0voto

zetetic Points 29261

Je ne vois pas très bien comment vous pouvez obtenir une exception ActiveRecord::RecordNotFound après avoir bloqué la méthode. Le stub devrait remplacer l'appel de la méthode.

Vous pouvez également envisager de fixer un message d'attente pour l'action, par exemple

controller.should_receive(:show)
get :show

qui doit échouer si un filtre avant empêche l'action d'être appelée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X