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