[rspec-users] mock weirdness

David Chelimsky dchelimsky at gmail.com
Mon Aug 22 09:08:05 EDT 2011


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



More information about the rspec-users mailing list