On Apr 25, 2011, at 11:30 PM, Rodrigo Rosenfeld Rosas wrote: > Em 25-04-2011 14:58, Matthew Van Horn escreveu: >> >> >> On Apr 25, 2011, at 1:36 PM, Matthew Van Horn wrote: >> >>> I've run into some strange behavior in porting my specs from rspec to >>> rspec2. >>> I am wondering if I am doing something wrong, or if I've misunderstood >>> something, or if this is some kind of bug. >>> >>> Look at the specs below: a >>> Both examples will pass if run singly. >>> The second one will fail if I run both examples. >>> >>> Can someone tell me why the second one fails the way it does? >>> >>> It has to do with the conditional assignment of @my_foo, but I'm not sure >>> why @stupid_mock is getting disconnected. >>> My thinking is that the class Bar is returning the same object in both >>> tests, and that the stub call in the second test is being sent to a >>> different object. >>> >>> Still, it did not behave this way in the last version, so I don't know what >>> I'm missing. >>> >>> require 'spec_helper' >>> >>> class Foo >>> end >>> >>> class Bar >>> def self.my_foo >>> @my_foo ||= Foo.new >>> end >>> def self.perform >>> my_foo.do_something >>> end >>> end >>> >>> describe Foo do >>> >>> before(:each) do >>> @stupid_mock = double('wtf') >>> Foo.stub(:new => @stupid_mock) >>> end >>> >>> it "passes here" do >>> @stupid_mock.should_receive(:do_something).and_return('value') >>> Bar.perform >>> end >>> >>> it "fails here" do >>> @stupid_mock.stub(:do_something => 'value') >>> Bar.perform >>> # double "wtf" received unexpected message :do_something with (no args) >>> end >>> >>> end >> >> btw - I just realized, that should be: "describe Bar do" >> and, I can solve the problem by doing: Bar.stub(:my_foo => @stupid_mock) >> instead of Foo.stub(:new => @stupid_mock) but I really don't like stubbing >> methods on the class I am testing. >> > > The problem is that "new" is not a regular method on Ruby. I don't mind > mocking some methods of the class being tested in some cases.
It doesn't have to do with the "new" method - if I did: class Bar def self.my_foo @my_foo ||= Foo.make_one_of_these end ... end and Foo.stub(:make_one_of_these => @stupid_mock) It still would fail. It is more of a pass-by-value/pass-by-reference issue. Because of the conditional assignment, the variable @stupid_mock in the failing example seems to be pointing to a different object than the one in the passing example, even though under the old rspec, they seemed to be the same.
_______________________________________________ rspec-users mailing list rspec-users@rubyforge.org http://rubyforge.org/mailman/listinfo/rspec-users