[rspec-users] BDD / cucumber thought - chaining 'Then' steps with Which

David Chelimsky dchelimsky at gmail.com
Fri Sep 26 08:33:02 EDT 2008


On Fri, Sep 26, 2008 at 6:30 AM, Matt Wynne <matt at mattwynne.net> wrote:
> Going back to the debate about keeping state between steps, I found myself
> with the mild urge to be able to write this today:
> Given there is a user
> And the user has 20 friends
> Then I should see a thumbnail of each of the users's friends
> Which should be a link to the user profile page for that friend
> NB: An idiom in this which may be songkick-only but was inspired by what
> we've read on this list, and worth explaining: "the user" as in "the user
> has 20 friends", means User.first in rails. If there's more than one user
> when this step runs, it will flunk, because the English no longer works.
> So anyway, what I was thinking was that it would be nice to be able to refer
> to the last thing I said I should be able to see, and decorate it with more
> specification in a subsequent step or steps.
> Obviously, I could roll these into one long Then step, but maybe this is
> more elegant...
> Just thinking out loud. I have no idea what the steps code would look like.
> WDYT?

One of the promises of using treetop is the ability to extend the
grammar yourself to include keywords like Which.

As for maintaining state across steps, I know that Aslak recommends
avoiding this on the cucumber wiki, but I can tell you I've not once
(as in never ever ever) been bitten by doing this. I've got a couple
of helper methods I use to create and retrieve instance variables that
are uniquely named. See http://gist.github.com/13087.

Including that module in env.rb allows me to do this:

Given a user with login "ernie" and password "rubber"
And a user with login "bert" and password "duckie"
And ernie is assigned the admin role
And bert is assigned the contributor role
...

Given /^a user with login "(.*)" and password "(.*)"$/ do |login, password|
  create_user_named(login, password) do |user|
    set_ivar :user, login, user
  end
end

Given /^(.*) is assigned the (.*) role$/ do |login, role|
  get_ivar :user, login do |user|
    user.add_role(role)
  end
end

... thus creating and retrieving instance variables named user_ernie
and user_bert with different roles.

Other people have experiences, positive or negative, sharing state
across steps with instance variables?

> cheers,
> Matt
> ----
> http://blog.mattwynne.net
> http://songkick.com
> In case you wondered: The opinions expressed in this email are my own and do
> not necessarily reflect the views of any former, current or future employers
> of mine.


More information about the rspec-users mailing list