[rspec-users] should_redirect_to in advance - feels unnatural

aslak hellesoy aslak.hellesoy at gmail.com
Tue Nov 7 15:46:37 EST 2006


On 11/7/06, aslak hellesoy <aslak.hellesoy at gmail.com> wrote:
> On 11/7/06, David Chelimsky <dchelimsky at gmail.com> wrote:
> > On 11/7/06, Jay Levitt <lists-rspec at shopwatch.org> wrote:
> > > I can understand that it's easier for rspec to set up a mock in advance
> > > of the controller call.
> >
> > This was a philosophical choice, not a cop-out to make it easier to
> > implement. That sounds more defensive than it is meant to be. I just
> > want to assure you that our goal is to create the right API.
> >
> > > But it makes it difficult to do something like:
> > >
> > > context "The HarkController, given Louie the logged-in user" do
> > >   setup do
> > >     post :login, :username => 'louie', :password => 'atest'
> > >   end
> > >
> > >   specify "should redirect Louie to the home page"...
> > >
> > >   specify "should set Louie to be the current user"...
> > >
> > > end
> > >
> > > Instead, I have to break out the should-redirect into its own call,
> > > since the post is done at setup time, but that's not an appropriate
> > > place for a spec.
> >
> > The BDD way, at least as I see it, is rooted in the TDD way:
> >
> > 1. setup objects in a known starting state (setup - perhaps stubs)
> > 2. set expectations of how the object should react to an action (mocks)
> > 3. perform the action
> > 4. verify that the object reacted as expected (verify mocks plus
> > additional assert-like expectations)
> >
> > The setup/specify structure is intended to let you step 1 (setup) in
> > the setup and do whatever combination of 2-4 that you like in specify.
> > In my view, the post is the action, and it belongs in the specify
> > block in this case.
> >
>
> Agreed. Consider the GWT* format (which I encourage people to use). A
> typical acceptance criterion similar to your example could be:
>
> GIVEN A new HarkController
> AND Louie logged in
> WHEN Louie logs out
> THEN He is redirected to the frontpage
>
> context "A new HarkController and Louie logged in" do # GIVEN
>   setup do # GIVEN
>     controller.should_redirect_to :action => 'homepage'
>     post :login, :username => 'louie', :password => 'atest'

# Or better, since it doesn't do the extra action:
session[:user] = User.new

>   end
>
>   specify "Should redirect Louie to the homepage when he logs out" #
> THEN and WHEN
>     controller.should_redirect_to :action => 'frontpage'
>     post :logout
>   end
> end
>
> * http://www.dannorth.net/introducing-bdd
> * http://jayfields.blogspot.com/2006/11/story-card-format.html (My comment)
>
> Thinking in terms of GWT and knowing how to map them to RSpec will
> make spec writing much easier I think.
>
> > The problem there is that it doesn't feel DRY. That's a problem I'm
> > interested in solving, but I'd prefer to do it in a way that helps to
> > express the behaviour-driven nature of BDD. What that means yet I'm
> > not sure. I have a couple of ideas that I'll share as they become
> > slightly more fully baked. I'd love to hear yours in the mean time.
> >
> > What I'm doing for examples like yours above is adding a method for
> > the post and calling it from each of my specify blocks. Still not
> > completely DRY, but it tells the story. And that is much more
> > important to me than the risk of having to change something in more
> > than one place in a spec.
> >
> > As for before or after the action, we did add
> > controller.should_have_rendered for after. We could do something
> > similar: controller.should_have_redirected_to. Or we could do what I
> > originally had in there which was that should_render was smart enough
> > to work on either side of the action. Looking at a few specs, I found
> > that to be more confusing and, hence, split into 'before' and 'after'
> > forms.
> >
> > Of these options, what do you like, and what not?
> >
> > Thanks for playing,
> > David
> >
> >
> > >
> > > What's the right solution?
> > >
> > > Jay Levitt
> > >
> > > _______________________________________________
> > > 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
> >
>


More information about the rspec-users mailing list