Helpful rspec matchers for testing validations and associations.
Switch branches/tags
Nothing to show
Pull request Compare This branch is 9 commits ahead, 2 commits behind pat:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Some helpful rspec matchers for testing validations and associations. It is not complete, especially in the case of validations, and lacking in documentation, but might be useful nonetheless.


Freelancing-god’s original version:

script/plugin install git://

Narnach’s version:

script/plugin install git://

Make sure, in your spec_helper.rb file, you add an include as follows:

config.include ActiveMatchers::Matchers


Test validates_presence_of :name

Model.should need(:name).using(@valid_attributes)

Test validates_uniqueness_of :name

Model.should need(:name).to_be_unique.using(@valid_attributes)

Test presence of at least one field being required

Model.should need.one_of(:first_name, :last_name).using(@valid_attributes)

Test validates_inclusion_of :age, :in => 0..99

Model.should need(:age).to_be_in_range(0..99).using(@valid_attributes)

Test validates_length_of :name matches database field length

Model.should limit_length_of(:name).using(@valid_attributes)

Test validates_length_of :name, :maximum => 255

Model.should limit_length_of(:name).to(255).using(@valid_attributes)

Test validates_length_of :name, :minimum => 3

Model.should limit_length_of(:name).from(3).using(@valid_attributes)

Test validates_length_of :name, :within => 3..40

Model.should limit_length_of(:name).from(3).to(40).using(@valid_attributes)

Test validates_numericality_of :age

Model.should need(:age).to_be_numeric.using(@valid_attributes)

You can group multiple validation checks together like so:

using(@valid_attributes) do Model.should need(:name) Model.should limit_length_of(:name).to(255) end

Also allows confirmation of the presence of associations

Test belongs_to :parent

Model.should belong_to(:parent)

Test belongs_to :parent, :class_name => "CustomClass", :foreign_key => "some_id"

Model.should belong_to(:parent).with_options( :class_name => “CustomClass”, :foreign_key => “some_id”)

Test has_many :items

Model.should have_many(:items)

Test has_many :items, :class_name => "CustomClass", :foreign_key => "some_id"

Model.should have_many(:items).with_options( :class_name => “CustomClass”, :foreign_key => “some_id”)

Similar testing available for has_one (Model.should have_one) and has_and_belongs_to_many (Model.should have_and_belong_to_many)

When you have the validates_existence plugin installed, or when you manually check the existence of a related model,
the following will be useful:

Test validates_existence_of :parent

Model.should validate_existence_of(:parent).using(@valid_attributes)

Test validates_existence_of :parent, :allow_nil => true

Model.should validate_existence_of(:parent).with_options(:allow_nil=>true).using(@valid_attributes)

If 0 (zero) as value is allowed too, then you can add the :allow_zero=>true option:

Model.should validate_existence_of(:parent).with_options(:allow_zero=>true).using(@valid_attributes)


Copyright © 2007 Pat Allan & James Healy, released under the MIT license