On Mon, Nov 1, 2010 at 8:55 AM, Alexey Ilyichev <bluesman.a...@gmail.com> wrote: > 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.
In RSpec-2 it raises an informative error, so I think this is what we should do in RSpec-1. Would you like to submit a patch to make it do that? > 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.rb > for 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, dchelim...@gmail.com <dchelim...@gmail.com> > wrote: >> >> >> On Oct 28, 7:40 am, Alexey Ilyichev <bluesman.a...@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...@gmail.com> >> > Date: Thu, Oct 28, 2010 at 12:44 PM >> > Subject: Issue with AR::Base descendants with certain argument >> > To: rspec-us...@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@rubyforge.org >> http://rubyforge.org/mailman/listinfo/rspec-users > > > _______________________________________________ > rspec-users mailing list > rspec-users@rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users > _______________________________________________ rspec-users mailing list rspec-users@rubyforge.org http://rubyforge.org/mailman/listinfo/rspec-users