How do you factor out common "before(:each)" calls so that multiple specs can use them?

I’d like to factor this bunch of code so that all of my controller tests
(well, almost all of them) use this before(:each) block:

before(:each) do
@user = User.new
controller.stub(:authenticate_user!)
controller.stub(:current_user).and_return(@user)
controller.stub(:add_secure_model_data)
end

Is there any way to do that? I don’t want to include it in all
controllers… because there are a few that don’t need this. By
basically,
every controller that extends from SecureController will need this
before(:each) block.

Is there any nice way to do that?

Thanks

Ken

On May 25, 2011, at 3:50 PM, Ken Egervari wrote:

Is there any nice way to do that?

http://relishapp.com/rspec/rspec-core/v/2-6/dir/example-groups/shared-context

Cheers,
David

Ken,

I’ve sometimes found extracting this code into a helper like

def login(user)
@controller.stub(:authenticate_user!)
@controller.stub(:current_user).and_return(user)
@controller.stub(:add_secure_model_data)
user
end

and

before(:each)
@user = login(User.new)
end

because most of my controller spec files have to have specs covering
unautheticated attempts to access a secured action, or the User may
have to be constructed in different ways, and this approach makes it
easier to have scenarios for both authenticated and unauthenticated
access in the same spec. YMMV.

Best,
Sidu.
http://c42.in

That’s a really good suggestion Sidu. As I’ve been refactoring my tests,
I
have actually come across such as a case where @admin is the current
signed
in user, but I am testing the UsersController, so I also have @user :wink:
Can
be confusing… lol.

Ken