On Apr 18, 2009, at 1:17 PM, Fernando Perez wrote:
Hi,
Let's take the example of the depot app. In my controller I set
@order.
Then in the view comes the bad stuff:
@order.items.each do |item|
item.product.title
end
Now I'm having problems specing item.product.title. A quick and dirty
fix is to trade a for for an underscore, so I create
Item#product_title:
def product_title
product.title
end
The problem is that I have a few models that act the same way, so I
would find myself writing lot's of these little instance methods, and
the solution looks a bit stupid to me. So how do you handle such
issue?
Personally, I don't think its so bad to violate the 'Law of
Demeter'(which of course is really just a guideline) in cases such as
these dealing with domain models. All but the simplest apps will have
entities that relate to other entities and each entity will of course
have its own attributes. Sometimes I'll bring up a property from a
child entity if its extremely common(as may be the case with
product_title) but that's not the case most of the time. In this case,
IF I was trying to spec a view for an 'Order', I'd probably use a
factory method of some sort that would handle creating the desired
object graph. If these models already exist, I usually use real
objects in place of mocks. There are quite a few Factory/Builder type
libs out there for ActiveRecord. In my case, we're typically dealing
with Java/Hibernate domain layers through JRuby so I haven't used any
of them, but its been simple enough to roll my own so far.
it "should show product title" do
order = new_order(:title => 'the product title')
....
end
-lenny
I thought about composed_of, but AWDWR's examples still break
Demeter's
law and that annoys me.
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users