I think the difference comes down to whether you are writing specs or tests. It is good enough for RSpec or Cucumber to fake out AR proxies if all you are doing is testing something. If it is a spec, then I believe that having the framework fake out the test is very dangerous, because a random piece of Ruby code that does the same thing will get different results than the spec. The bottom line is that AR has bad behavior in this regard. But, having a spec that pretends it is otherwise only documents a false view of the world, and other programmers reading that spec will think that they can count on the results to be different than they are. The result of the first call and the second are not different objects, but different contents. It would be much better if AR was consistent in representing the result set over time, rather than changing the collection out from under you, but it does do that.

Just my $0.02, but I really like specs to be treated as specifications for what SHOULD be happening, not pretending other code is different than it is.

In this case the argument can be made on whether RSpec is introducing the change in behavior with its timing of the evaluations and comparisons, so in this case it is not black and white to me, but I would lean to more explicit acknowledgment of what AR is rather than what AR should be. David's suggestion of a constraint that shows the reader something odd is going on here with the proxies and give them pause before using the proxy in the same way the RSpec code did initially.

Michael




On Sep 28, 2008, at 3:09 PM, Ashley Moran wrote:


On Sep 28, 2008, at 7:52 pm, David Chelimsky wrote:

What you're proposing could be resolved with an argument constraint
that's been discussed in some other threads on this list - something
like:

lambda {...}.should change{...}.to(array_consisting_of(...))

I'd prefer this as it lets us keep the single matcher, but allows us
to make it more flexible by adding different constraints. We already
have hash_including. This would expand that sort of capability.

WDYT?



On the basis that my code isn't a Rails app*, but I'd still like this fix, I vote +1 for "array_consisting_of" (or something).

How about...
 lambda {...}.should change{...}.to(collection_equivalent_to(...))
?

Bit long winded but I think it expresses the intent? (Correct me if not...)

As for change vs change_contents_of, I vote for keeping the one matcher. I don't think I should be expected to know when an object that replies to ==([]) is not an array.

Or an H R Giger alien for that matter...

Cheers
Ashley



* Ironically in my attempt to escape Rails, I have, in the same day, both been bitten by an ORM that behaves like ActiveRecord, and a different gem that loads ActiveSupport and borks 'require' when I run my specs. =(

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

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

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

Reply via email to