On Aug 22, 2011, at 5:11 AM, Nikolay Sturm wrote:
> Hi,
>
> I have a strange problem with mocking an object that has a method called
> ''load''. With Rails 2.3 and rspec-rails 1.3 I could do sth
like this:
>
> describe Foo do
> let(:bar) { mock(Bar).as_null_object }
> before(:each) do
> Bar.stub(:new).and_return(bar)
> end
>
> it ''does something'' do
> Foo.do_something
> end
> end
>
> with
>
> class Foo
> def do_something
> bar = Bar.new
> bar.load
> end
> end
>
> After an upgrade to rails 3.0.10 and rspec-rails 2.6.1 I get an
> ArgumentError:
> wrong number of arguments (0 for 1)
>
> If I add "bar.method(:load)" to do_something(), it prints
>
> #<Method:
RSpec::Mocks::Mock(ActiveSupport::Dependencies::Loadable)#load>
This ^^ tells you everything you need to know to research the problem.
If you look at the code for ActiveSupport::Dependencies
(https://github.com/rails/rails/blob/v3.0.10/activesupport/lib/active_support/dependencies.rb),
you''ll see that the Loadable module is included in every object. See:
https://github.com/rails/rails/blob/v3.0.10/activesupport/lib/active_support/dependencies.rb#L654
https://github.com/rails/rails/blob/v3.0.10/activesupport/lib/active_support/dependencies.rb#L281-286
This means that even mock objects already have a load method, which is defined
to accept one or more arguments:
https://github.com/rails/rails/blob/v3.0.10/activesupport/lib/active_support/dependencies.rb#L234-236
This means that you need to explicitly stub the load method to do what
you''re trying to do:
let(:bar) { mock(Bar, :load => nil).as_null_object }
HTH,
David
> which doesn''t look right to me. I am using ree-1.8.7-2011.03.
>
> Does anyone have an idea what this is about and how to properly deal
> with this?
>
> cheers,
>
> Nikolay