On Jun 13, 2011, at 9:44 PM, S Ahmed wrote:

> On Mon, Jun 13, 2011 at 9:37 PM, David Chelimsky <dchelim...@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

_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to