Testing 'nil.should == something_not_nil' fails

Hello,

After upgrading to rspec 2.0.0.rc, I ran into an issue that I reported
at Failure to render diff for 'nil.should == something_not_nil' · Issue #183 · rspec/rspec-core · GitHub. When
testing something that returned nil, effectively executing ‘nil.should
== something_not_nil’, rspec would come crashing down. It turned out not
to be a bug in rspec (or, at least, David can’t reproduce it).

I initially wrote it off as something strange with my setup and worked
around it for now (specs usually succeed, so nil == nil and everything
works fine), but as ‘scrymmyin’ reported seeing the same behavior in
issue 183, and as I also see it with rspec 2.0.0, I thought it might be
nice to document it here.

I can reproduce the behavior as follows:

  • gem install rspec --version=2.0.0
  • mkdir sandbox; cd sandbox
  • create Gemfile with contents
    gem ‘rspec’, ‘2.0.0’
  • run bundle install
  • mkdir spec
  • create spec/nil_fail.rb with contents
    describe ‘Sandbox’ do
    it ‘should show the difference’ do
    nil.should == ‘foo’
    end
    end
  • run rspec spec/nil_fail.rb

The result is:

user@machine:~/dev/ruby/sandbox$ rspec spec/nil_fail.rb
F

Failures:

  1. Sandbox should show the difference
    $REE_gems_path/rspec-core-2.0.0.rc/lib/rspec/core/formatters/base_formatter.rb:138:in
    find_failed_line’: undefined methoddowncase’ for nil:NilClass
    (NoMethodError)

from
$REE_gems_path/rspec-expectations-2.0.0.rc/lib/rspec/expectations/fail_with.rb:29:in
detect' from $REE_gems_path/rspec-core-2.0.0.rc/lib/rspec/core/formatters/base_formatter.rb:136:in each’
from
$REE_gems_path/rspec-core-2.0.0.rc/lib/rspec/core/formatters/base_formatter.rb:136:in
detect' from $REE_gems_path/rspec-core-2.0.0.rc/lib/rspec/core/formatters/base_formatter.rb:136:in find_failed_line’
from
$REE_gems_path/rspec-core-2.0.0.rc/lib/rspec/core/formatters/base_formatter.rb:122:in
read_failed_line' from $REE_gems_path/rspec-core-2.0.0.rc/lib/rspec/core/formatters/base_text_formatter.rb:27:in dump_failures’
from
$REE_gems_path/rspec-expectations-2.0.0.rc/lib/rspec/expectations/fail_with.rb:29:in
each_with_index' from $REE_gems_path/rspec-core-2.0.0.rc/lib/rspec/core/formatters/base_text_formatter.rb:17:in each’
from
$REE_gems_path/rspec-core-2.0.0.rc/lib/rspec/core/formatters/base_text_formatter.rb:17:in
each_with_index' from $REE_gems_path/rspec-core-2.0.0.rc/lib/rspec/core/formatters/base_text_formatter.rb:17:in dump_failures’
from $REE_gems_path/rspec-core-2.0.0.rc/lib/rspec/core/reporter.rb:74:in
send' from $REE_gems_path/rspec-core-2.0.0.rc/lib/rspec/core/reporter.rb:74:in notify’
from $REE_gems_path/rspec-core-2.0.0.rc/lib/rspec/core/reporter.rb:73:in
each' from $REE_gems_path/rspec-core-2.0.0.rc/lib/rspec/core/reporter.rb:73:in notify’
from $REE_gems_path/rspec-core-2.0.0.rc/lib/rspec/core/reporter.rb:22:in
conclude' from $REE_gems_path/rspec-core-2.0.0.rc/lib/rspec/core/reporter.rb:13:in report’
from
$REE_gems_path/rspec-core-2.0.0.rc/lib/rspec/core/command_line.rb:23:in
run' from $REE_gems_path/rspec-core-2.0.0.rc/lib/rspec/core/runner.rb:55:in run_in_process’
from $REE_gems_path/rspec-core-2.0.0.rc/lib/rspec/core/runner.rb:46:in
run' from $REE_gems_path/rspec-core-2.0.0.rc/lib/rspec/core/runner.rb:10:in autorun’
from $REE_path/bin/rspec:19

best regards,

On Oct 13, 2010, at 10:02 AM, Ivo W. wrote:

works fine), but as ‘scrymmyin’ reported seeing the same behavior in

  • mkdir spec
    user@machine:~/dev/ruby/sandbox$ rspec spec/nil_fail.rb
    `detect’

$REE_gems_path/rspec-core-2.0.0.rc/lib/rspec/core/formatters/base_formatter.rb:122:in

from
each' run_in_process’
from $REE_gems_path/rspec-core-2.0.0.rc/lib/rspec/core/runner.rb:46:in run' from $REE_gems_path/rspec-core-2.0.0.rc/lib/rspec/core/runner.rb:10:in autorun’
from $REE_path/bin/rspec:19

FYI - setting an expectation on nil was a red herring. The example could
have failed for any other reason (“foo”.should eq(“bar”)) and the same
error would have occurred.

The problem was actually related to the filename. While rspec was able
to load up the file named outside the _spec.rb convention (i.e.
nil_fail.rb), it was not able to correctly report a failure in that
file.

Fixed:

To be released in 2.0.1.

Cheers,
David