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