"What happens though, if you want to override a class in an instance of an object, and not all of its kind? Typically you would define a mock object, and create an instance of it. But, in Ruby there is an easier and faster way that doesnâ€™t involve writing a different mock class for each different scenario â€“ and it is made possible by the singleton class. This clever bit of ruby hackery lets you override the behaviour of a single instance of a class, creating what Iâ€™ve decided to call a partial mock object. To demonstrate, Iâ€™ve written a small method called override_method which will override the behaviour of the specified method in the passed object, like so:
# Overrides the method +method_name+ in +obj+ with the passed block
def override_method(obj, method_name, &block)
# Get the singleton class/eigenclass for 'obj'
klass = class <
As you can see, only the first object in the arrayâ€™s behaviour has been changed â€“ the rest have remained untouched. Because of this, you can embed these partial dynamic mock objects deeply into your code without the need to specially instantiate a mock object deep in your code, or writing a â€˜clever mockâ€™ to only trigger the determined behaviour in certain objects.
Where this code comes in really handy is when you need an object to raise a difficult to simulate exception (like a disk full error) on a certain method to test your error handling â€“ simply call override_method and pass in a call to raise and voila! Dynamic partial mock objects on the fly!"