On 1 Apr 2010, at 21:35, David Chelimsky wrote:

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.
David

I can't help but chime in here that I would be pretty irritated to come across a test that mixed up using mocks and real objects, especially when they're the same class. Can you not use a mock for the other instance of User too?


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

cheers,
Matt

http://mattwynne.net
+447974 430184

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

Reply via email to