On 30/09/11 3:58 PM, David Chelimsky wrote:
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
One thing I noticed, and something that always catches me out is the
fact that the 'let'ted object doesn't get instantiated until it gets
referenced. Therefore,
describe "all" do
let(:foo) { Foo.create! }
it "returns the created object" do
Foo.all.should include(foo)
end
end
... fails, since at the time of calling :all, the 'foo' object hasn't
been referred yet, and hence the block hasn't executed. "Foo.all" in the
case above returns an empty array, which wouldn't have been the case
with an instance object created in "before(:each)".
Srushti
http://c42.in
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users