Forum: RSpec recommendations for writing view index spec for a resource which behaves differently for different u

Posted by Gordon (Guest)
on 2011-12-12 12:50
(Received via mailing list)
hi guys,

 In my index view specs for a given resource, I have successfully
written it for admin users.

For the given resource, when admin users are looking at the index
page, they should see
-a link to add a new resource object
-links to delete/edit/show for each resource object created

My index view specs does this perfectly and it reads:

------- file: begin -----------------------


192-168-1-4:categories anexiole$  cat index.html.erb_spec.rb
require 'spec_helper'

describe "categories/index.html.erb" do
  before(:each) do
  view.stub(:is_admin).and_return(true)

  assign( :categories, [
      FactoryGirl.create(:category_intakes),
      FactoryGirl.create(:category_audio),
    ]
  )
  end

  it "renders a list of categories" do
    render
    assert_select 'tr>td', :text => 'intakes and filters'.to_s, :count
=> 1
    assert_select 'tr>td', :text => 'audio'.to_s, :count => 1
  end

  it 'renders an interface with the new link' do
    render
    rendered.should contain ('New Category')
  end

end

------- file: end    -----------------------


Now, I would then like to put more specs in the index view spec.

When a non-admin user (ie someone who has not logged in) looks at the
index page, the user
should NOT see
-a link to add a new resource object
-links to delete/edit/show for each resource object created

1) How can I best write this?
2) Would using ":let" before each different spec (admin and non-admin)
be a good way to do it?

thank you :)
Posted by David Chelimsky (Guest)
on 2011-12-12 15:29
(Received via mailing list)
On Dec 12, 2011, at 5:30 AM, Gordon wrote:

> My index view specs does this perfectly and it reads:
>
> ------- file: begin -----------------------
>
>
> 192-168-1-4:categories anexiole$  cat index.html.erb_spec.rb
> require 'spec_helper'
>
> describe "categories/index.html.erb" do
>  before(:each) do
>   view.stub(:is_admin).and_return(true)

^^ I've been in the habit of using view.stub(:is_admin => true).

Also, the Ruby idiom for questions like "is this being viewed by an 
admin" is a Ruby predicate - a method name with a question mark at the 
end:

  view.stub(:admin? => true)

Names like is_admin are usually holdovers from Java :)

>    assert_select 'tr>td', :text => 'audio'.to_s, :count => 1
^^ 'intakes and filters' and 'audio' are already strings, so you don't 
need .to_s.

>
> Now, I would then like to put more specs in the index view spec.
>
> When a non-admin user (ie someone who has not logged in) looks at the
> index page, the user
> should NOT see
> -a link to add a new resource object
> -links to delete/edit/show for each resource object created
>
> 1) How can I best write this?

Best is subjective. One way you can write it is:

context "viewed by a non-admin" do
  before do
    view.stub(:admin? => false)
    # set up assigns
  end
  it "should not see xxx" do
    render
    assert_select selector, .. :count => 0
    # or, if you're using Capybara
    rendered.should_not have_tag(selector)
  end
end


> 2) Would using ":let" before each different spec (admin and non-admin)
> be a good way to do it?

let() is for creating objects, which is not what you're doing here - 
you're simulating different logins. I'd stick with stubbing :admin? in 
the before declaration.

Cheers,
David
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.