On Sep 28, 2008, at 5:01 pm, David Chelimsky wrote:

Wow.

OK - here's what I figured out. Talk about insidious bugs! This is
actually quite a bit different from what I thought.

There are two lambdas involved here:

lambda {
 1st lambda: expression that should cause the change
}.should change{
 2nd lambda: expression that returns the object that should change
}.to(expected value)

The matcher executes the 1st lambda and stores the result as @before.
In your example this is a Rails association proxy for the
Story.unposted collection.

The matcher then executes the 2nd lambda.

The matcher then executes the 1st lambda again and stores the result
as @after. In your example, this is, again, a Rails association proxy
for the Story.unposted collection.

Hey,

Thanks for looking at this so quick! I'm sure I should be paying for RSpec :)

I think I follow, except shouldn't your references to lambdas 1 and 2 be reversed above?


At this point, @before and @after point to the same object - the same
Rails association proxy!!!!!!

The matcher passes if @before != @after and fails if @before ==
@after. Because they are actually the same association proxy, the
example fails.

Now rspec asks the matcher to print out the reason why it failed,
which does this:

"#{result} should have been changed to [EMAIL PROTECTED], but is now
[EMAIL PROTECTED]"

@to is the expected value []
@after is the association proxy, which proxies to an empty collection.
Now, when the matcher calls @after.inspect, is the first time that the
proxy is actually evaluated!!!!

Does this make sense?

Yes I sees what's going on now.

But... I'm not using Rails, and in fact I'm not even writing a web app. I'm using DataMapper, but clearly it violates the PoLS like AR. What I'd give for an ORM that uses plain old Ruby objects!!!

Ashley


--
http://www.patchspace.co.uk/
http://aviewfromafar.net/

_______________________________________________
rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to