aslak hellesoy wrote:
On Sun, Apr 12, 2009 at 5:35 PM, Ben Mabey <b...@benmabey.com
<mailto: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
Interesting.. I knew that the methods started out in
Cucumber::StepMother but I thought they had to be added to every
instance of Object to exhibit the behaviour that they do. That makes
even more sense now-- and it is a very nice technique to know about!
Thanks for clearing up that misunderstanding.
-Ben
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 <mailto: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
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users