S Ahmed
2011-Jun-14 01:29 UTC
[rspec-users] How to mock when there seems to be a requirement for chained mocked calls?
I want to mock the following: MyModel.where(".....").last I tried: MyModel.should_receive(:where).and_return(nil) but this of course doesn''t match the expectation since the call to .last was not mapped in the mock code. How can I do this? -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20110613/9f18040a/attachment.html>
David Chelimsky
2011-Jun-14 01:37 UTC
[rspec-users] How to mock when there seems to be a requirement for chained mocked calls?
On Jun 13, 2011, at 8:29 PM, S Ahmed wrote: "How to mock when there seems to be a requirement for chained mocked calls?" There is no such requirement unless you are imposing it by your own design decisions.> I want to mock the following: > > MyModel.where(".....").lastWhy do you want to do this? Is this in a model spec? A controller spec?> I tried: > > MyModel.should_receive(:where).and_return(nil) > > but this of course doesn''t match the expectation since the call to .last was not mapped in the mock code. > > How can I do this?You _can_ stub (not mock) chains like this: MyModel.stub_chain(:where, :last).and_return(xxx) You can also set chained expectations like this (but I wouldn''t recommend it): ar_query = double(''ar_query'') ar_query.should_receive(:last).and_return(nil) MyModel.stub(:where).and_return(ar_query) HTH, David
S Ahmed
2011-Jun-14 02:44 UTC
[rspec-users] How to mock when there seems to be a requirement for chained mocked calls?
This is a method in my Model that I am writing a test for correct. There are allot of if/else clauses in the method, and i want to make sure certain things are called so I want to write expectations for it. Not sure why you don''t recommend such a thing? (chained expecations) On Mon, Jun 13, 2011 at 9:37 PM, David Chelimsky <dchelimsky at gmail.com>wrote:> On Jun 13, 2011, at 8:29 PM, S Ahmed wrote: > > "How to mock when there seems to be a requirement for chained mocked > calls?" > > There is no such requirement unless you are imposing it by your own design > decisions. > > > I want to mock the following: > > > > MyModel.where(".....").last > > Why do you want to do this? Is this in a model spec? A controller spec? > > > I tried: > > > > MyModel.should_receive(:where).and_return(nil) > > > > but this of course doesn''t match the expectation since the call to .last > was not mapped in the mock code. > > > > How can I do this? > > You _can_ stub (not mock) chains like this: > > MyModel.stub_chain(:where, :last).and_return(xxx) > > You can also set chained expectations like this (but I wouldn''t recommend > it): > > ar_query = double(''ar_query'') > ar_query.should_receive(:last).and_return(nil) > MyModel.stub(:where).and_return(ar_query) > > 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/20110613/45f7c21c/attachment.html>
David Chelimsky
2011-Jun-14 03:09 UTC
[rspec-users] How to mock when there seems to be a requirement for chained mocked calls?
On Jun 13, 2011, at 9:44 PM, S Ahmed wrote:> On Mon, Jun 13, 2011 at 9:37 PM, David Chelimsky <dchelimsky at gmail.com> wrote: > On Jun 13, 2011, at 8:29 PM, S Ahmed wrote: > > "How to mock when there seems to be a requirement for chained mocked calls?" > > There is no such requirement unless you are imposing it by your own design decisions. > > > I want to mock the following: > > > > MyModel.where(".....").last > > Why do you want to do this? Is this in a model spec? A controller spec? > > > I tried: > > > > MyModel.should_receive(:where).and_return(nil) > > > > but this of course doesn''t match the expectation since the call to .last was not mapped in the mock code. > > > > How can I do this? > > You _can_ stub (not mock) chains like this: > > MyModel.stub_chain(:where, :last).and_return(xxx) > > You can also set chained expectations like this (but I wouldn''t recommend it): > > ar_query = double(''ar_query'') > ar_query.should_receive(:last).and_return(nil) > MyModel.stub(:where).and_return(ar_query)[I moved your post to the bottom]> This is a method in my Model that I am writing a test for correct. > > There are allot of if/else clauses in the method, and i want to make sure certain things are called so I want to write expectations for it. > > Not sure why you don''t recommend such a thing? (chained expectations)Because they are brittle. You can specify the externally observable behavior of a model without mocking its internals. This is _not_ the same as setting expectations on model methods called from controllers, in which case we''re specifying how one component (the controller) talks to another component (the model). In a model spec, the model _is_ the component being specified. That all make sense? HTH, David -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20110613/59829f48/attachment-0001.html>
Andrew Premdas
2011-Jun-14 18:29 UTC
[rspec-users] How to mock when there seems to be a requirement for chained mocked calls?
On 14 June 2011 04:09, David Chelimsky <dchelimsky at gmail.com> wrote:> On Jun 13, 2011, at 9:44 PM, S Ahmed wrote: > > On Mon, Jun 13, 2011 at 9:37 PM, David Chelimsky <dchelimsky at gmail.com>wrote: > > On Jun 13, 2011, at 8:29 PM, S Ahmed wrote: >> >> "How to mock when there seems to be a requirement for chained mocked >> calls?" >> >> There is no such requirement unless you are imposing it by your own design >> decisions. >> >> > I want to mock the following: >> > >> > MyModel.where(".....").last >> >> Why do you want to do this? Is this in a model spec? A controller spec? >> >> > I tried: >> > >> > MyModel.should_receive(:where).and_return(nil) >> > >> > but this of course doesn''t match the expectation since the call to .last >> was not mapped in the mock code. >> > >> > How can I do this? >> >> You _can_ stub (not mock) chains like this: >> >> MyModel.stub_chain(:where, :last).and_return(xxx) >> >> You can also set chained expectations like this (but I wouldn''t recommend >> it): >> >> ar_query = double(''ar_query'') >> ar_query.should_receive(:last).and_return(nil) >> MyModel.stub(:where).and_return(ar_query) >> > > [I moved your post to the bottom] > > This is a method in my Model that I am writing a test for correct. > > There are allot of if/else clauses in the method, and i want to make sure > certain things are called so I want to write expectations for it. > > This method will be hard to test because its not a good method. As itsalready written you might be better of refactoring first to remove all the if/else clauses. The most if/else clauses a method should have is 1!! A session with the ruby refactoring book is in order :)> Not sure why you don''t recommend such a thing? (chained expectations) > > > Because they are brittle. > > You can specify the externally observable behavior of a model without > mocking its internals. This is _not_ the same as setting expectations on > model methods called from controllers, in which case we''re specifying how > one component (the controller) talks to another component (the model). In a > model spec, the model _is_ the component being specified. That all make > sense? > > HTH, > David > > > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users >-- ------------------------ Andrew Premdas blog.andrew.premdas.org -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20110614/4234bb5c/attachment.html>