2010-09-09 6 views
5

Dies ist eine reine syntaktische Frage. Ich bin sehr neu in RSpec.Wie stubst du einen `current_user` mit update_attributes auf false?

ich im Grunde etwas auf den Linien dieser erroring Zeile schreiben wollen:

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

Wer weiß, wie man richtig, dass schreiben?

RSpec die Standard sieht wie folgt aus:

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

Antwort

8

Dies sieht aus wie ein Fall für stub_chain:

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

Beachten Sie, dass dies nur Methoden in der Liste in der Reihenfolge ersetzen wird sie auftreten, damit dies Sinn macht, haben Sie eine current_user.update_attributes in Ihrem Controller. Wenn Sie etwas wie @user.update_attributes haben, glaube ich nicht, dass es funktioniert.

Weitere Informationen über APIDock

+4

Ihre Arbeit auch! Stub_chaining ist unglaublich! : D Wo wäre ich ohne Zetetic? Wahrscheinlich arbeiten bei einem McDonalds – Trip

+0

lol! - Sie töten mich hier :) – zetetic

6

ich nur blind spielte mit tausend Variationen und schließlich bekam es mit diesem weitergeben müssen:

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

Aber im Ernst, bedeutet das auch einen Sinn? Es passiert: D

+1

Macht Sinn. current_user ist eine Methode, die eine Instanz von User zurückgibt. current_user verfügt nicht über eine update_attributes-Methode, User tut dies. Das Stubben von update_attributes für current_user führt nur dazu, dass es für die Instanz von User stubbing funktioniert wie erwartet. – jvatic

2

Mit RSpec 3.0 und rspec-mocks ist die Verwendung 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

Dies adressiert update_attributes nicht speziell, aber das folgende funktionierte für mich. Angenommen, Ihr current_user-Helper lebt in 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 
Verwandte Themen