2010-09-09 8 views
5

Ceci est une question purement syntaxique. Je suis très nouveau à RSpec.Comment est-ce que vous stub un `current_user` avec update_attributes mis à false?

Je veux essentiellement écrire quelque chose sur les lignes de cette ligne erroring:

controller.stub!(:current_user(:update_attributes => false)) 

Quelqu'un sait comment écrire correctement cela?

défaut de RSpec ressemble à ceci:

User.stub(:find) { mock_user(:update_attributes => false) } 

Répondre

8

Cela ressemble à un cas pour stub_chain:

controller.stub_chain(:current_user,:update_attributes).and_return(false)

Notez que cela est tout simplement va remplacer les méthodes de la liste dans l'ordre se produire, donc pour que ce soit logique, vous aurez un current_user.update_attributes dans votre contrôleur. Si vous avez quelque chose comme @user.update_attributes, je ne pense pas que cela fonctionnera.

Plus d'info sur APIDock

+4

Le vôtre fonctionne aussi! Stub_chaining est incroyable! : D Où serais-je sans Zetetic? Travaillant probablement à un McDonalds – Trip

+0

lol! - Vous me tuez ici :) – zetetic

6

Je aveuglément joué avec mille variations et enfin eu à passer avec ceci:

controller.stub!(:current_user).and_return(@user) 
@user.stub!(:update_attributes => false) 

Mais sérieusement, est-ce que même un sens? Il passe: D

+1

Cela prend tout son sens. current_user est une méthode qui renvoie une instance de User. current_user n'a pas de méthode update_attributes, l'utilisateur le fait. Donc stubbing update_attributes pour current_user ne fait rien d'autre que le talonner pour que l'instance de l'utilisateur fonctionne comme prévu. – jvatic

2

Avec RSpec 3.0 et rspec-mocks, la façon de faire est d'utiliser allow.

before(:each) do 
    @user = mock_model(User) 
    allow(controller).to(receive(:current_user).and_return(@user)) 
    allow(@user).to(receive(:update_attributes).and_return(false)) 
end 
0

Cela ne concerne pas spécifiquement update_attributes, mais les opérations suivantes ont fonctionné pour moi. En supposant que votre helper current_user vit dans ApplicationController:

user = double(:user) 
allow(controller).to(receive(:current_user).and_return(user)) 
allow(controller.current_user).to receive(:is_admin?).and_return(false) 

current_user.is_admin? # => false