[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