On Sun, Apr 12, 2009 at 5:35 PM, Ben Mabey <b...@benmabey.com> 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.
>

This isn't exactly how it works. The Given, When, Then methods (and a few
others) are defined in the Cucumber::StepMother module. This module is
extended by the Ruby top level object, which is a single instance. Object is
not altered. Here is an interesting discussion about it:
http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/7b023b23385241c7?pli=1



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

Reply via email to