[rspec-users] a better "should have valid associations"
Courtenay
court3nay at gmail.com
Thu Mar 29 04:18:27 EDT 2007
This is pretty much the same as last time around, if you recall.
Thanks to Wilson for converting to the new form. I've added a few
lines. Basically, it iterates over your model associations and does
two things.
- First, just try to call the association. Usually fixes speeling
erors or other such silliness.
- Second, try to find a record with an :include on the association.
This actually hits the DB and will tell you if you have lingering
associations on deleted models. Page.find(:first, :include => :user)
(Note: I usually feel that testing associations is really testing the
framework, and such code belongs in the framework itself. Also, this
won't check if you removed some associations. And it won't check for
polymorphs either.)
Put this somewhere handy and require it into spec_helper.
========================================
module ActiveRecordMatchers
class HaveValidAssociations
def matches?(model)
@failed_association = nil
@model_class = model.class
model.class.reflect_on_all_associations.each do |assoc|
begin
model.send(assoc.name, true)
model.class.send('find', :first, :include => assoc.name)
rescue ActiveRecord::EagerLoadPolymorphicError
# nothing. Can't find :include a polymorph. This requires a
better test.
rescue => err
@failed_association = "#{assoc.name} // #{err}"
end
end
!@failed_association
end
def failure_message
"invalid association \"#{@failed_association}\" on #{@model_class}"
end
end
def have_valid_associations
HaveValidAssociations.new
end
end
========================================
Put this in your model spec.
context "A new Page" do
include ActiveRecordMatchers
specify "should have valid associations" do
object = Page.new
object.should have_valid_associations
end
end
========================================
court3nay
http://blog.caboo.se
More information about the rspec-users
mailing list