From: James Mead Date: 2006-11-28T18:27:27+09:00 Subject: Re: Mocha and ActiveRecord ------=_Part_9004_13248903.1164706041386 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline On 28/11/06, J. B. Rainsberger wrote: > > Suppose I have an Order, which has_many OrderItems. Suppose I want to > write a test that checks that when I ask the Order to do something, it > asks its order items to do that something. I tried to do this like so: > > def test_delegates > order_items = [] > 3.times { > item = mock("order item", :do_something => nil) > order_items.push(item) > } > > order = Order.new(:order_items => order_items) > order.do_something > end > > This works with normal objects, but it seems ActiveRecord objects don't > like someone passing them Mocha::Mock objects in their constructors. > They check that the order items, in this case, are OrderItem objects. > > Is there something in ActiveRecord I can override to relax this > behavior? I don't like having to create an OrderItem just to add a > single stub or expectation. > What we tend to do in this case is stub the collection method itself i.e. Order#order_items. So you could do something like this... def test_should_do_something_to_all_order_items order_items = Array.new(3) { mock('order item', :do_something => nil) } order = Order.new order.stubs(:order_items).returns(order_items) order.do_something end When I have a spare couple of hours I'll be releasing a new version of Mocha that supports mocking of the is_a?. This will allow you to make this work with ActiveRecord, but with the disadvantage that you are coupling your test to the innards of ActiveRecord. I hope that helps. -- James. http://blog.floehopper.org ------=_Part_9004_13248903.1164706041386--