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 2011-08-22 12:14
on 2011-08-22 15:19
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 (https://github.com/rails/rails/blob/v3.0.10/active...), you'll see that the Loadable module is included in every object. See: https://github.com/rails/rails/blob/v3.0.10/active... https://github.com/rails/rails/blob/v3.0.10/active... 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/active... 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
on 2011-08-22 16:08
* David Chelimsky [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. :) cheers, Nikolay
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.