Jay Donnell
2008-Feb-07 01:50 UTC
[rspec-users] trying to spec login requirement with a shared example
In all of my controller specs I have tests that look something like this.
it "should require login" do
get :edit, :id => ''7''
response.should redirect_to(new_session_path)
end
I''d like to move this to a shared example, but the request call (get()
or post()) varies with each example. Is there a good way to tell the shared
example how to request the page?
I thought about doing something like this
describe "whatever" do
def request_page
get :edit, :id => ''7''
end
# use shared example
end
then in the shared example I would call request_page() instead. Although this is
slightly more DRY it isn''t saving me any lines of code and it feels
like there could be a better way. Another idea I had was to make a helper
function that returns a Proc (basically I''m faking currying) and I
could bind that Proc to something like @request_proc and then run the proc in
the shared example.
Anyone have any better ideas?
Jay
____________________________________________________________________________________
Looking for last minute shopping deals?
Find them fast with Yahoo! Search.
http://tools.search.yahoo.com/newsearch/category.php?category=shopping
Ben Mabey
2008-Feb-07 03:37 UTC
[rspec-users] trying to spec login requirement with a shared example
I don''t claim that my idea/way is a good way to go about it since it is
kinda hackisk... but this is what I have been doing... In my
spec_helper.rb I''ll have the following:
module Spec::Example::ExampleGroupMethods
def it_should_require_a_user_to_be_logged_in
it "should redirect to the signup page when no user is logged in"
do
stub_no_one_logged_in
send("do_#{[:get, :post, :put, :delete].find{|verb| respond_to?
:"do_#{verb}"}}")
response.should redirect_to(signup_url(:service =>
"http://#{request.host}#{request.env["REQUEST_URI"]}"))
end
end
end
The implementation of it_should_require_a_user_to_be_logged_in are of
course specific to my app but you get the picture with what I''m doing
with the send command... Again, I know this is hackish but it was the
best I could come up with. So it your example groups you can just say
stuff like:
describe UsersController, "handling PUT /users/1" do
before do
@user = stub_login(mock_user(:update_attributes => true))
User.stub!(:find).and_return(@user)
end
def do_put
put :update, :id => @user.id
end
it_should_require_a_user_to_be_logged_in
....
end
Prior to this I would alias all of my do_put, do_get, etc.. as
do_action, and then just call do_action. Hmm.. that actually just gave
me an idea. You could use the method_added hook that ruby provides to
alias the do_get, do_put, etc.. to do_action every time it is defined.
How does that sound?
I haven''t tested it but that might be the best way to do things now
that
I think about it.
Hope that helps... If you try out the method_added idea let me know
since I would be interested.
-Ben
Jay Donnell wrote:> In all of my controller specs I have tests that look something like this.
>
> it "should require login" do
> get :edit, :id => ''7''
> response.should redirect_to(new_session_path)
> end
>
> I''d like to move this to a shared example, but the request call
(get() or post()) varies with each example. Is there a good way to tell the
shared example how to request the page?
>
> I thought about doing something like this
>
> describe "whatever" do
> def request_page
> get :edit, :id => ''7''
> end
>
> # use shared example
> end
>
> then in the shared example I would call request_page() instead. Although
this is slightly more DRY it isn''t saving me any lines of code and it
feels like there could be a better way. Another idea I had was to make a helper
function that returns a Proc (basically I''m faking currying) and I
could bind that Proc to something like @request_proc and then run the proc in
the shared example.
>
> Anyone have any better ideas?
>
> Jay
>
>
>
>
>
____________________________________________________________________________________
> Looking for last minute shopping deals?
> Find them fast with Yahoo! Search.
http://tools.search.yahoo.com/newsearch/category.php?category=shopping
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>