[rspec-users] Testing ''nil.should == something_not_nil'' fails

David Chelimsky
2010-10-14T01:11:33Z

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

> Hello,
>
> After upgrading to rspec 2.0.0.rc, I ran into an issue that I reported
> at http://github.com/rspec/rspec-core/issues/issue/183/#issue/183. 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 at 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

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:
http://github.com/rspec/rspec-core/commit/9c6b6f74da382d0810ab337730828c5fd94e309b

To be released in 2.0.1.

Cheers,
David