On Sep 30, 2011, at 3:31 PM, Patrick J. Collins wrote: >> Proper usage, sure, but the memoization is only within each example - not >> across examples. That way you can do this: >> >> let(:thing) { Thing.new } >> >> it "does something" do >> thing.blah >> thing.whatever >> thing.yet_again >> end >> >> In that case each reference to thing returns the same object. >> >> Make sense? > > Hmm.. now I am confused... > > What is the difference between: > > describe "Foo" do > > let(:foo) { Foo.new } > > it "is tubular" do > foo.bar > foo.baz > end > > it "is gnarly" do > foo.gnarl > foo.wurd_up > end > > end > > vs. > > describe "Foo" do > > before :each do > @foo = Foo.new > end > > it "seems just as tubular as the foo w/ let" do > @foo.bar > @foo.baz > end > > it "seems just as gnarly as the foo w/ let" do > @foo.gnarl > @foo.wurd_up > end > > end > > I am not seeing any difference...?
There is not, really, other than how the declaration of foo is expressed and referenced. This evolved out of a common pattern in TDD: 1: describe "something" do it "does something" do thing = Thing.new thing.do_something.should have_some_outcome end end 2: describe "something" do it "does something" do thing = Thing.new thing.do_something.should have_some_outcome end it "does something else" do thing = Thing.new thing.do_something_else.should have_some_other_outcome end end Now there is duplication so we can refactor out the declaration of thing. It takes less work and is less error prone to change it to a let declaration than to change the references to thing to an instance variable declared in a before hook. Cheers, David _______________________________________________ rspec-users mailing list rspec-users@rubyforge.org http://rubyforge.org/mailman/listinfo/rspec-users