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.