How can I mock the XMLRPC::Client.new3 class method using rspec''s mock? I expected this spec: describe Foo do it ''should call new3'' do options = {} XMLRPC::Client.any_instance.should_receive(:new3).with(options) Foo.new(options) end end with this class definition: class Foo def new(options) @server = XMLRPC::Client.new3(options) end end to pass but instead I got the error: 1) Foo should call new 3 Failure/Error: Unable to find matching line from backtrace Exactly one instance should have received the following message(s) but didn''t: new3 How can I change the spec to make this pass (while verifying that new3 was called)? Thanks, Christopher
> 1) Foo should call new 3 > Failure/Error: Unable to find matching line from backtrace > Exactly one instance should have received the following > message(s) but didn''t: new3 > > How can I change the spec to make this pass (while verifying that new3 > was called)? >This probably isn''t working because .new3 is a class method, and you are setting an expectation for an instance method to be called. The way I would do this would be something like: client = stub("XMLRPC::Client", :new3 => true) XMLPRC::Client.should_receive(:new3).with(options).and_return(client) Patrick J. Collins http://collinatorstudios.com
I knew it was a class method but wasn''t sure how to put an expectation on a class method. I tried your suggestion but, unfortunately, it still fails, although with a different error message: 1) Foo should call new 3 Failure/Error: XMLRPC::Client.should_receive(:new3).with(options).and_return(client) (<XMLRPC::Client (class)>).new3({:host=>"host.com", :path=>"xmlrpc.php", :port=>"80", :user=>"username", :password=>"password"}) expected: 1 time received: 0 times Any other suggestions? Thanks for your help, Christopher On 01/09/2012 11:46 AM, Patrick J. Collins wrote:>> 1) Foo should call new 3 >> Failure/Error: Unable to find matching line from backtrace >> Exactly one instance should have received the following >> message(s) but didn''t: new3 >> >> How can I change the spec to make this pass (while verifying that new3 >> was called)? >> > This probably isn''t working because .new3 is a class method, and you are > setting an expectation for an instance method to be called. The way I > would do this would be something like: > > client = stub("XMLRPC::Client", :new3 => true) > XMLPRC::Client.should_receive(:new3).with(options).and_return(client) > > Patrick J. Collins > http://collinatorstudios.com > _______________________________________________ > 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/20120109/0fa1d55d/attachment.html>
I got it working. I had defined new on Foo rather than initialize so it was my dumb mistake that prevented your solution from working. Thanks a lot for your help Patrick. Christopher On 01/09/2012 01:15 PM, Christopher Voltz wrote:> I knew it was a class method but wasn''t sure how to put an expectation > on a class method. I tried your suggestion but, unfortunately, it > still fails, although with a different error message: > > 1) Foo should call new 3 > Failure/Error: > XMLRPC::Client.should_receive(:new3).with(options).and_return(client) > (<XMLRPC::Client (class)>).new3({:host=>"host.com", > :path=>"xmlrpc.php", :port=>"80", :user=>"username", > :password=>"password"}) > expected: 1 time > received: 0 times > > Any other suggestions? > > Thanks for your help, > Christopher > > On 01/09/2012 11:46 AM, Patrick J. Collins wrote: >>> 1) Foo should call new 3 >>> Failure/Error: Unable to find matching line from backtrace >>> Exactly one instance should have received the following >>> message(s) but didn''t: new3 >>> >>> How can I change the spec to make this pass (while verifying that new3 >>> was called)? >>> >> This probably isn''t working because .new3 is a class method, and you are >> setting an expectation for an instance method to be called. The way I >> would do this would be something like: >> >> client = stub("XMLRPC::Client", :new3 => true) >> XMLPRC::Client.should_receive(:new3).with(options).and_return(client) >> >> Patrick J. Collins >> http://collinatorstudios.com >> _______________________________________________ >> 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/20120109/dc5a739d/attachment.html>