[rspec-users] DRYer controller specs

David Chelimsky
2007-04-27T14:54:22Z

On 4/27/07, Chris Hoffman <chris.c.hoffman at gmail.com>
wrote:
> Oh, so I wouldn''t be able to take advantage of the patch if I
applied
> it myself (e.g., lots of bugs )?

We haven''t tried to apply it. It might work just fine. Aslak and I
need to take a closer look at it before we agree to apply it and there
are other priorities for both of us both in and out of rspec at the
moment.

If you do apply it and it works, please report to this list about your
experience.

Cheers,
David

> I''m sure you can glean my opinion of
> the idea from the fact that I would like to start using it right away
> :)
>
> It seems like a generalized solution that wouldn''t be specific to
> rails, but easily amenable to it, which works for me.
>
> -Chris
>
> On 4/27/07, David Chelimsky <dchelimsky at gmail.com> wrote:
> > On 4/27/07, Chris Hoffman <chris.c.hoffman at gmail.com> wrote:
> > > That has some potential, indeed.  Is there a URL you can point me
to
> > > that will instruct me on how to install the HEAD of the RSpec
> > > repository?  It looks like I require 0.9 to take advantage of
this
> > > patch.  Thanks.
> >
> > Actually, the patch hasn''t been applied yet. I was just
asking to get
> > your opinion.
> >
> > As for using trunk in a rails project, take a look at
> > http://rspec.rubyforge.org/documentation/rails/install.html.
> >
> > Cheers,
> > David
> >
> >
> >
> > >
> > > -Chris
> > >
> > > On 4/27/07, David Chelimsky <dchelimsky at gmail.com>
wrote:
> > > > On 4/27/07, Chris Hoffman <bosshoff at gmail.com>
wrote:
> > > > > Your''s is a good question.  I too have been
looking for ways to DRY up
> > > > > my controller tests.  The more I am starting to obey a
CRUD-only
> > > > > design, the more duplication I am encountering in these
specs.  Right
> > > > > now, I am combating this dilemma by making a bunch of
methods in
> > > > > spec_helper that define _context_ and _specify_
statements, such as:
> > > > >
> > > > > def specify_should_handle_an_invalid_id_nicely(params)
> > > > >   controller =
"#{params[:controller].camelize}Controller"
> > > > >   model = params[:controller].classify.constantize
> > > > >   params[:redirect_to] ||= { :action =>
''index'' }
> > > > >   params[:actions] ||= [:edit, :update, :show,
:destroy]
> > > > >
> > > > >   params[:actions].to_a.each do |action|
> > > > >     context "#{controller}##{action}, given an
id" do
> > > > >       controller_name params[:controller]
> > > > >
> > > > >       specify "should call #{model}.find_by_id,
instead of #{model}.find" do
> > > > >
model.should_receive(:find_by_id).with("the id")
> > > > >         send(:process, action, :id => "the
id")
> > > > >       end
> > > > >     end
> > > > >
> > > > >     context "#{controller}##{action}, not given a
valid id" do
> > > > >       controller_name params[:controller]
> > > > >
> > > > >       setup do
> > > > >         model.stub!(:find_by_id)
> > > > >       end
> > > > >
> > > > >       specify "should redirect_to
#{params[:redirect_to]}" do
> > > > >         send(:process, action)
> > > > >         response.should_redirect_to
params[:redirect_to]
> > > > >       end
> > > > >
> > > > >       specify "should populate the flash with a
message indicating
> > > > > that the record wasn''t found" do
> > > > >         send(:process, action)
> > > > >         flash[:notice].should == "#{model} not
found"
> > > > >       end
> > > > >     end
> > > > >   end
> > > > > end
> > > > >
> > > > > This approach is obviously clunky, and I would myself
like a better
> > > > > way to specify controller-wide contracts, as it were.
Just as above,
> > > > > any action that requires an id as a parameter should
behave a certain
> > > > > way, and I shouldn''t have to define this
behavior in each controller''s
> > > > > specification; it should be application-wide.
> > > >
> > > > Would
http://rubyforge.org/tracker/?func=detail&group_id=797&aid=9605&atid=3151
> > > > satisfy your needs?
> > > > _______________________________________________
> > > > rspec-users mailing list
> > > > rspec-users at rubyforge.org
> > > > http://rubyforge.org/mailman/listinfo/rspec-users
> > > >
> > > _______________________________________________
> > > rspec-users mailing list
> > > rspec-users at rubyforge.org
> > > http://rubyforge.org/mailman/listinfo/rspec-users
> > >
> > _______________________________________________
> > rspec-users mailing list
> > rspec-users at rubyforge.org
> > http://rubyforge.org/mailman/listinfo/rspec-users
> >