Incapable de stub méthode d'assistance avec rspec
Je suis en train d'écraser une méthode sur un assistant, qui est définie dans mon contrôleur. Par exemple:
class ApplicationController < ActionController::Base
def current_user
@current_user ||= authenticated_user_method
end
helper_method :current_user
end
module SomeHelper
def do_something
current_user.call_a_method
end
end
Dans mon Rspec:
describe SomeHelper
it "why cant i stub a helper method?!" do
helper.stub!(:current_user).and_return(@user)
helper.respond_to?(:current_user).should be_true # Fails
helper.do_something # Fails 'no method current_user'
end
end
Dans spec/support/authentication.rb
module RspecAuthentication
def sign_in(user)
controller.stub!(:current_user).and_return(user)
controller.stub!(:authenticate!).and_return(true)
helper.stub(:current_user).and_return(user) if respond_to?(:helper)
end
end
RSpec.configure do |config|
config.include RspecAuthentication, :type => :controller
config.include RspecAuthentication, :type => :view
config.include RspecAuthentication, :type => :helper
end
J'ai posé une question similaire ici, mais réglé sur un travail autour de. Ce comportement étrange a se dirigea de nouveau et je voudrais comprendre pourquoi cela ne marche pas.
Mise à JOUR: j'ai trouvé que l'appel controller.stub!(:current_user).and_return(@user)
avant helper.stub!(...)
est ce qui est à l'origine de ce comportement. C'est assez facile à corriger dans spec/support/authentication.rb
, mais est-ce un bug Rspec? Je ne vois pas pourquoi il devrait pas être en mesure de stub une méthode sur une assistance si c'était déjà écrasé sur un contrôleur.
- Essayez de cogner de la méthode à travers ApplicationController, puisque c'est là où il est défini.
ApplicationController.stub(:current_user => @user)
EDIT: Maintenant, je pense que cela pourrait ne pas fonctionner. - Non, ça n'a pas fonctionné. J'ai essayé
any_instance
trop à pas de chance. En fait, j'ai eu à travailler, mais je suis un peu confus (peut-être trouvé un bug avec rspec). Je mettrai à jour la question de peu de temps. - Sonne comme un bug. Il est certainement la peine de dépôt de la question github.com/rspec/rspec-mocks/issues (et d'essayer avec la dernière version).
- Créé billet: github.com/rspec/rspec-mocks/issues/135
- j'ai le même problème, n'ont aucune des solutions encore?
Vous devez vous connecter pour publier un commentaire.
Essayer cela, il a travaillé pour moi:
La première partie est basée sur cette réponse par l'auteur de RSpec, et la deuxième partie est basée sur ce Débordement de Pile répondre.
Mise à jour de Matthieu Ratzloff réponse: Vous n'avez pas besoin de l'instance de l'objet et de stub! a été désapprouvée
Modifier. RSpec 3 façon de
stub!
serait:allow(helper).to receive(:current_user) { user }
Voir: https://relishapp.com/rspec/rspec-mocks/v/3-2/docs/
Rspec 3
Dans RSpec 3.5 RSpec, il semble que
helper
n'est plus accessible à partir d'unit
bloc. (Il vous donne le message suivant:(Je n'arrive pas à trouver toute la documentation sur ce changement, c'est l'ensemble des connaissances acquises expérimentalement).
La clé pour résoudre ce est de savoir que les méthodes d'assistance sont les méthodes d'instance, et que pour votre propre helper, il est facile de le faire:
C'est ce qui a finalement fonctionné pour moi
Notes De Bas De Page/De Crédit Où Le Crédit En Raison:
Cela a fonctionné pour moi dans le cas de RSpec 3:
def ...
de bloquer l'utilisation directementuser
, donc pas de tampon est nécessaire?