[rspec-users] Fwd: Issue with AR::Base descendants with certain argument

Alexey Ilyichev bluesman.alex at gmail.com
Mon Nov 1 06:55:59 EDT 2010


David, I got your point, however I find behavior in version 1.3.1
inconsistent. In my opinion, if I stub a method with a certain parameter
value, and then call with another value, it should either delegate to
original method, return nil, or throw an exception. I'd be happy with either
of these. But what it actually does is delegating to the original method in
the superclass, which doesn't make sense to me at all. This is what my spec
results to if I comment out the fix in code:

1)
'stubbing with arguments should call derived class method_missing when args
differ from what is stubbed and the method is missing' FAILED
expected: "*b_method_missing*",
     got: "*a_method_missing*" (using ==)

 Diff:
@@ -1,2 +1,2 @@
-*b_method_missing*
+*a_method_missing*

/home/alex/rspec/spec/spec/mocks/stubbing_with_arguments_spec.rb:26:

2)
'stubbing with arguments should call present method when it is defined in
derived class and args differ from what is stubbed' FAILED
expected: "*b_present_method*",
     got: "*a_method_missing*" (using ==)

 Diff:
@@ -1,2 +1,2 @@
-*b_present_method*
+*a_method_missing*

/home/alex/rspec/spec/spec/mocks/stubbing_with_arguments_spec.rb:36:

(see
http://github.com/alexz77/rspec/blob/master/spec/spec/mocks/stubbing_with_arguments_spec.rbfor
the spec code)
And also, it behaved differently in 1.2.9. My original problem arisen after
updating to 1.3.1

On Sun, Oct 31, 2010 at 3:14 PM, dchelimsky at gmail.com
<dchelimsky at gmail.com>wrote:

>
>
> On Oct 28, 7:40 am, Alexey Ilyichev <bluesman.a... at gmail.com> wrote:
> > I have made 2 examples for this and I can't figure out how to make both
> > pass. Take a look please:
> >
> > require 'spec_helper'
> >
> > describe "Mock" do
> >   class A
> >     def self.method_missing(name, *args, &block)
> >       '*a_method_missing*'
> >     end
> >
> >     def self.present_method(arg)
> >       '*present_method*'
> >     end
> >   end
> >
> >   class B < A
> >     def self.method_missing(name, *args, &block)
> >       '*b_method_missing*'
> >     end
> >   end
> >
> >   it 'should call derived class method_missing when args differ from what
> is
> > stubbed' do
> >     B.stub!(:missing_method).with(1).and_return '*stub*'
> >     B.missing_method(2).should == '*b_method_missing*'
> >   end
> >
> >   it 'should call present_method when it is defined in parent class and
> args
> > differ from what is stubbed' do
> >     B.stub!(:present_method).with(1).and_return '*stub*'
> >     B.present_method(2).should == '*present_method*'
> >   end
> > end
> >
> > ---------- Forwarded message ----------
> > From: Alexey Ilyichev <bluesman.a... at gmail.com>
> > Date: Thu, Oct 28, 2010 at 12:44 PM
> > Subject: Issue with AR::Base descendants with certain argument
> > To: rspec-us... at rubyforge.org
> >
> > Hi!
> >
> > I am trying to upgrade rspec-rails to 1.3.3, and one of my specs fails.
> >
> > In before :each I stub finder method like this:
> > Payment.stub!(:find_by_id).with(@payment.id.to_s).and_return @payment
> > Payment class is derived from AR::Base
> >
> > And then in one of the examples I call Payment.find_by_id((@payment.id +
> > 1).to_s), and I am expecting it to return null, as it used to with 1.2.9
> > version, however it leads to an exception in active_record/base.rb.
> > Analyzing the stack trace I figured that in line 115 of mock/proxy.rb
> method
> > find_by_id is called for ActiveRecord::Base, which is not correct.
> >
> > I'm not familiar with rspec internals, so I don't have an idea on where
> in
> > code the actual problem is. So any help would be greatly appreciated.
>
> The expected behaviour is that when you stub or mock a method on a
> real object (we call this partial stubbing/mocking), the framework
> takes over that method for the duration of the example. So the
> expectation that when the wrong args are received the call is
> delegated to the original object is incorrect, and making this change
> would introduce potential problems for other users who count on this
> behaviour.
>
> There is a request to add an explicit way to call to the original in
> rspec-mocks-2's issue tracker:
> http://github.com/rspec/rspec-mocks/issues#issue/23.
>
> HTH,
> David
> _______________________________________________
> 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/20101101/5d13fae5/attachment.html>


More information about the rspec-users mailing list