[rspec-users] [RSpec] Clarification on using shared_examples_for on a Rails Controller

David Chelimsky dchelimsky at gmail.com
Wed Apr 22 14:06:27 EDT 2009


On Wed, Apr 22, 2009 at 12:04 PM, Stephen H. Gerstacker
<stephen at shortround.net> wrote:
> I have a Rails controller that I am using 'before_filter' on certain actions
> to assign some extra variables.  I noticed the 'shared_examples_for' method
> and thought this would be a good way to test that the given actions are
> loading what they need.  I wrote the following:
>
> shared_examples_for 'pages showing the yearly archive' do
>
>     it 'should assign a list of yearly archives' do
>       Factory.create(:post, :published_at => Time.local(2009,02,01))
>       Factory.create(:post, :published_at => Time.local(2009,01,01))
>       Factory.create(:post, :published_at => Time.local(2008,01,01))
>       Factory.create(:post, :published_at => Time.local(2007,01,01))
>       Factory.create(:post, :published_at => Time.local(2001,01,01))
>
>       get :index
>
>       assigns[:years].should == [ 2009, 2008, 2007, 2001 ]
>     end
>
>   end
>
> The problem is, it is specific to the 'index' action.  I can't use the
> 'it_should_behave_like "pages showing the yearly archive"' for other
> actions.
>
> Am I just doing this wrong or is there a way to fix this?

Shared examples don't support parameterization, but macros do. Try
something like this:

module Macros
  def shows_yearly_archive_for(requests={})
    requests.keys.each do |action|
      it "should assign a list of yearly archives on
#{requests[action]}  #{action}" do
        Factory.create(:post, :published_at => Time.local(2009,02,01))
        Factory.create(:post, :published_at => Time.local(2009,01,01))
        Factory.create(:post, :published_at => Time.local(2008,01,01))
        Factory.create(:post, :published_at => Time.local(2007,01,01))
        Factory.create(:post, :published_at => Time.local(2001,01,01))

        send requests[action], action

        assigns[:years].should == [ 2009, 2008, 2007, 2001 ]
      end
    end
  end
end

describe SomeController do
  extend Macros
  shows_yearly_archive_for :index => :get
end

You can also extend with Macros from the config in spec_helper:

Spec::Runner.configure {|c| c.extend(Macros, :type => :controller)}

HTH,
David

ps - completely un-tested - that was off the top of my head


>
> - Stephen H. Gerstacker
>
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>


More information about the rspec-users mailing list