On Mar 20, 2011, at 11:38 PM, andyl wrote:

> OK - I got this working using mocha and the 'any_instance' method.  
> 
> A gist with working examples is here: https://gist.github.com/879029
> 
> It looks like rspec mocks had an 'any_instance' method, but it was removed 
> because it promoted 'bad practice'.

It was never released, and was removed because the patch was incomplete in 
retrospect. There is an open issue on this right now, with a patch in progress 
that I hope to include in the next release, assuming it is ready when that 
release is ready to go.

> I'm curious to understand how 'any_instance' promotes bad practice.  I found 
> it useful in my situation, to stub out slow network code that crushed my test 
> performance.

In general, we want test code to be as narrow and precise as possible. This 
means we should control which objects we are dealing with at any moment. 
any_instance is a bandaid for a situation in which the design makes it 
difficult to get a handle on a specific instance. If we're actually doing TDD 
this should never happen, but sometimes we use frameworks like ActiveRecord, 
which provides two different objects in this scenario:

widget = Factory(:widget)
found_widget = Widget.find(widget.id)

These two objects ^^ have the same attributes, but are not the same object. 
This means that stubbing methods on widget does not have any impact on 
found_widget. In this case, any_instance saves the day, but it leaves open some 
holes in tests. Consider:

order = Factory(:order)
Order.any_instance.should_receive(:confirm)
put :confirm, :order_id => order.id

If the examples and code change over time such that there are more than one 
order at play and the wrong one receives confirm(), this example will still 
pass.

FYI - ActiveRecord will soon have an identity map, which means that this code 
will work:

order = Factory(:order)
order.should_receive(:confirm)
put :confirm, :order_id => order.id

This is a much better situation as it is very precise.

HTH,
David

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

Reply via email to