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

Andrew Premdas apremdas at gmail.com
Tue Jan 5 08:35:25 EST 2010


2010/1/4 David Chelimsky <dchelimsky at gmail.com>

> On Mon, Jan 4, 2010 at 2:57 PM, Andrew Premdas <apremdas at gmail.com> wrote:
>
>> 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.
>>
>
> Agreed. Patches welcome!
>

David,

I hope my comment didn't come out as sniping/bitchy/negative, and the
suggested refactorings were useful. Couldn't really make a patch as I don't
have the context to name things correctly.

Anyhow thanks once again for all your wonderful work on rspec and on this
mailing list it really is very much appreciated.

All best

Andrew


>
>
>>  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
>>>
>>
>>
>> _______________________________________________
>> rspec-users mailing list
>> rspec-users at rubyforge.org
>> http://rubyforge.org/mailman/listinfo/rspec-users
>>
>
>
> _______________________________________________
> 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/20100105/93e13ce4/attachment-0001.html>


More information about the rspec-users mailing list