[rspec-users] setting partial stub for just one value and letting obj handle the rest

David Chelimsky dchelimsky at gmail.com
Thu Apr 1 16:35:34 EDT 2010

On Apr 1, 2010, at 3:14 PM, drewB wrote:

> Occasionally, I find myself in a situation where I want to have a mock
> obj returned if a method is called with a particular argument but
> handled normally otherwise.  For example, lets say I have a Model
> named User and I am specing a controller that sends messages from one
> user to another.  When User.find is called for the user who is making
> the request I want it to run normally but when User.find is called for
> the receiver I want it to return a mocked obj.  In this case, I can do
> something like (http://gist.github.com/352305):
> user = mock_model(User)
> User.stub!(:find).at_least(1).and_return do |id|
>    if id == mock_user.id.to_s
>      user
>    else
>      User.find_by_id(id)
>    end
> end
> If I didn't have another method that allowed me to find a User by it's
> id this won't work.
> Is there an easier way to accomplish this?

Not really. When you stub a method, the framework overrides that method with its own implementation. There's no mechanism in place to say "pass the message onto the real object if it doesn't have the arguments I'm interested in." I'm not sure of any framework that does that. Maybe RR, but I'm not sure.

Good luck.

More information about the rspec-users mailing list