[rspec-users] should_redirect_to in advance - feels unnatural

David Chelimsky dchelimsky at gmail.com
Tue Nov 7 20:14:54 EST 2006


On 11/7/06, aslak hellesoy <aslak.hellesoy at gmail.com> wrote:
> 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

I like that a LOT better, because a failure in the login process won't
cause this spec to fail. Better isolation.

Thanks,
David

>
> >   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
> > >
> >
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>


More information about the rspec-users mailing list