Hi, On 27 Apr 2011, at 20:55, Sergio Ruiz wrote:
> i am setting up a few objects that are interrelated for use in an rspec > test.. > > something like: > > describe Dimension do > > before(:each) do > text = "string here" This defines a local variable 'text' which lives for the duration of the before block. It can't be seen by the #it block (example) below, because it's gone out of scope. > end > > it "should puts string" do > puts text > end > > end > > when i run this, i get an error: undefined local variable or method > `text' > > am doing something wrong? > > thanks! What people don't realise is that #describe just creates an instance of a class, called ExampleGroup. Think of the 'before' block and the 'it' blocks as methods on that class. If you defined a private variable in one method on a class, you wouldn't expect to be able to see it from another one, would you? Here's what we used to do in this kind of situation: describe Dimension do before(:each) do @text = "string here" end it "should puts string" do puts @text end end Because, as I expect you know, instance variables *can* be seen between methods on a class. However, some people found the instance variables noisy, or wanted to lazy initialise them, so started doing this: describe Dimension do def text @text ||= "string here" end it "should puts string" do puts text end end As I said, #describe just creates a class, so you can define methods on that class if you like. Now our puts statement is calling the #text method that we've defined. This is such a common pattern, that in RSpec 2, David introduced #let blocks, which let you refactor the above code to look like this: describe Dimension do let(:text) { "string here" } it "should puts string" do puts text end end Make sense? cheers, Matt -- Freelance programmer & coach Founder, http://relishapp.com +44(0)7974430184 | http://twitter.com/mattwynne _______________________________________________ rspec-users mailing list rspec-users@rubyforge.org http://rubyforge.org/mailman/listinfo/rspec-users