[Rspec-users] new handling of equality

David Chelimsky dchelimsky at gmail.com
Tue Oct 17 00:01:41 EDT 2006


All,

Based mostly on the earlier thread on "should_be", we have introduced
a new branch called should_be_working_like_ruby with the new proposed
handling for equality.

Per the CHANGES file in that branch (rev 896):

============================================
IMPORTANT NOTE: THIS RELEASE IS NOT 100% BACKWARDS COMPATIBLE TO 0.6.x

This release changes the way RSpec handles equality. Previous releases
tried to handle equality
based on the way the words read, rather than the way ruby actually
handles equality. So,
with this release and going forward:

* actual.should_equal(expected) will pass if actual.equal?(expected)
returns true
* actual.should_eql(expected) will pass if actual.eql?(expected) returns true
* actual.should == expected will pass if actual == expected) returns true

At the high level, eql? implies equivalence, while equal? implies
object identity. For more
information on how ruby deals w/ equality, you should do this:

ri equal?

or look at this:

http://www.ruby-doc.org/core/classes/Object.html#M001057

Also, we left in should_be as a synonym for should_equal, so the only
specs that should break are the
ones using should_equal (which used to use <code>==</code> instead of
<code>.equal?</code>).

Lastly, should_be used to handle true and false differently from any
other values. We've removed
this special handling, so now actual.should_be true will fail for any
value other than true (it
used to pass for any non-nil, non-false value), and actual.should_be
false will fail for any
value other than false (it used to pass for nil or false).

Here's what you'll need to do to update your specs:
1. search for "should_equal" and replace with "should_eql"
2. run specs

If any specs still fail, they are probably related to should_be(true)
or should_be(false) using
non-boolean values. Those you'll just have to inspect manually and
adjust appropriately (sorry!).
============================================

There are two outstanding issues.

1. actual.should != expected does not work (right now you can use
should_not_eql)
2. lambda { expr }.should_eql expected compares to the proc rather
than the result

I'll bring these up in separate threads, so please don't respond to
this thread w/ either of these issues.

I'd encourage any and all of you who can check out and build from
source to check out and build this branch and let us know what other
issues you encounter. We'll be releasing this soon, and would like to
make the transition from 0.6.x to 0.7.0 as smooth as possible for all.

Thanks,
David


More information about the Rspec-users mailing list