[rspec-users] 'Expected NoMethodError, got NameError'

Andrew Premdas apremdas at gmail.com
Mon Jan 4 15:57:22 EST 2010


2009/12/30 Paul Hinze <paul.t.hinze at gmail.com>

> Given this simple cucumber feature (related to another rspec bug I am
> working on):
>
>  http://gist.github.com/266335
>
> I'm fighting with this error messages that _only_ shows up in certain
> situations that I can't quite pin down (rake features breaks, individual
> cucumber run works, rake with debugger beforehand works...)
>
> > expected NoMethodError, got #<NameError: undefined local variable or
> method `nap' for Time:Class
> > ./features/step_definitions/stubs_dont_leak_steps.rb:10:in `/^nap time
> should not be defined$/'
> > features/either/stubs_dont_leak.feature:11:in `Then nap time should not
> be defined'
>
> I've tracked it down to this line:
>
> http://github.com/dchelimsky/rspec/blob/master/lib/spec/mocks/proxy.rb#L117


This method is really unpleasant, perhaps some standard refactorings to
remove the complex conditional conditions and remove the nested if's would
be useful first of all.


>
>  def message_received(sym, *args, &block)
>    expectation = find_matching_expectation(sym, *args)
>    stub = find_matching_method_stub(sym, *args)
>
>    if (stub && expectation && expectation.called_max_times?) || (stub &&
> !expectation)
>      if expectation = find_almost_matching_expectation(sym, *args)
>        expectation.advise(args, block) unless
> expectation.expected_messages_received?
>      end
>      stub.invoke(*args, &block)
>    elsif expectation
>      expectation.invoke(*args, &block)
>    elsif expectation = find_almost_matching_expectation(sym, *args)
>      expectation.advise(args, block) if null_object? unless
> expectation.expected_messages_received?
>      raise_unexpected_message_args_error(expectation, *args) unless
> (has_negative_expectation?(sym) or null_object?)
>    else
> -->   @target.__send__ :method_missing, sym, *args, &block
>    end
>  end
>
> My question is this... why do we fall back to method_missing here rather
> than a simple 'send' to the target?  I figure there is likely a reason,
> so if someone could help me understand I'll happily open up my
> expectation to should_raise(NameError) and move along. :)
>
> Cheers,
>
> Paul
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20100104/721be99d/attachment-0001.html>


More information about the rspec-users mailing list