[rspec-users] Cucumber - Recommended viewing.

Matt Wynne matt at mattwynne.net
Sun Apr 12 12:14:09 EDT 2009

On 12 Apr 2009, at 16:35, Ben Mabey wrote:

> Matt Wynne wrote:
>> On 11 Apr 2009, at 01:07, James Byrne wrote:
>>> http://mwrc2009.confreaks.com/14-mar-2009-15-00-bdd-with-cucumber-ben-mabey.html
>> Great job with the talk Ben, it's a really good intro to Cucumber  
>> and I will be pointing anyone who asks towards it.
>> One question about the kitten-killing. I was surprised that  
>> defining methods in your env / step_definition files adds methods  
>> to *every instance* of Object. I thought it just added those  
>> methods to the particular instance of Object that's used to create  
>> the World.
>> Did I misunderstand the you in the talk, or misunderstand the code  
>> in Cucumber?
> Well, the step definitions themselves don't add themselves to every  
> instance.  The Given, When, and Then methods have actually killed  
> some kittens and already live on Object (sometimes it is okay).  The  
> step methods will register the passed in blocks to the StepMother--  
> not onto Object.  So if that is what you are referring to you are  
> correct.
> However, if you want to create a ruby helper method then you will  
> need to wrap it in a module to prevent to from being added to every  
> object instance.  In my example I had something like:
> def login_as(user)
> visit '/login'
> fill_in 'Email', :with => user.email
> fill_in 'Password', :with => 'password'
> click_button
> end
> If you place that method in the top-level in either your env.rb or  
> any step files it is going to be living on Object since Cucumber  
> will load up these files as any other ruby file.  So you could call  
> #login_as on an Array or any other object!  Definitely not what we  
> want.  So, you need to wrap it in a module and use the World hook to  
> make the helper methods available only in your World (which you get  
> a new one for every scenario).  With the new World syntax (as of  
> 0.2.3 I believe) it would be:
> module UserHelpers
> def login_as(user)
>   visit '/login'
>   fill_in 'Email', :with => user.email
>   fill_in 'Password', :with => 'password'
>   click_button
> end
> end
> World(UserHelpers)
> I feel like I may of just repeated what I said in the  
> presentation... so you still may be just as confused. :/  Let me  
> know if that helps to clarify things or what part of it is confusing.

Yeah you did, but I think you've made me realise something obvious:  
there's a difference between the ruby you write in the env and step  
matchers, and the ruby you write *inside* the step matchers. It's the  
later that gets evaluated in the context of the World instance, the  
former that gets evaluated in the root namespace.


Matt Wynne

More information about the rspec-users mailing list