Mock weirdness

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>

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


“It’s all part of my Can’t-Do approach to life.” Wally

On Aug 22, 2011, at 5:11 AM, Nikolay Sturm wrote:

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
(rails/activesupport/lib/active_support/dependencies.rb at v3.0.10 · rails/rails · GitHub),
you’ll see that the Loadable module is included in every object. See:

rails/activesupport/lib/active_support/dependencies.rb at v3.0.10 · rails/rails · GitHub
rails/activesupport/lib/active_support/dependencies.rb at v3.0.10 · rails/rails · GitHub

This means that even mock objects already have a load method, which is
defined to accept one or more arguments:

rails/activesupport/lib/active_support/dependencies.rb at v3.0.10 · rails/rails · GitHub

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

  • David C. [2011-08-22]:

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 }

Thanks for the explanation, David. I wasn’t sure whether or not this was
accepted behaviour, I would have expected a null object to be, well, an
object without methods. At least the next guy’s google search will point
to the solution. :slight_smile:

cheers,

Nikolay