Module Shoulda::ActiveRecord::Macros
In: lib/shoulda/active_record/macros.rb

Macro test helpers for your active record models

These helpers will test most of the validations and associations for your ActiveRecord models.

  class UserTest < Test::Unit::TestCase
    should_validate_presence_of :name, :phone_number
    should_not_allow_values_for :phone_number, "abcd", "1234"
    should_allow_values_for :phone_number, "(123) 456-7890"

    should_not_allow_mass_assignment_of :password

    should_have_one :profile
    should_have_many :dogs
    should_have_many :messes, :through => :dogs
    should_belong_to :lover
  end

For all of these helpers, the last parameter may be a hash of options.

Methods

Included Modules

Helpers Matchers

Public Instance methods

Deprecated: use ActiveRecord::Matchers#allow_mass_assignment_of instead.

Ensures that the attribute can be set on mass update.

  should_allow_mass_assignment_of :first_name, :last_name

Deprecated: use ActiveRecord::Matchers#allow_value instead.

Ensures that the attribute can be set to the given values.

Example:

  should_allow_values_for :isbn, "isbn 1 2345 6789 0", "ISBN 1-2345-6789-0"

Deprecated: use ActiveRecord::Matchers#belong_to instead.

Ensure that the belongs_to relationship exists.

  should_belong_to :parent

Deprecated: use ActiveRecord::Matchers#ensure_length_of instead.

Ensures that the length of the attribute is at least a certain length

Options:

  • :short_message - value the test expects to find in errors.on(:attribute). Regexp or string. Default = I18n.translate(‘activerecord.errors.messages.too_short’) % min_length

Example:

  should_ensure_length_at_least :name, 3

Deprecated: use ActiveRecord::Matchers#ensure_length_of instead.

Ensures that the length of the attribute is in the given range

Options:

  • :short_message - value the test expects to find in errors.on(:attribute). Regexp or string. Default = I18n.translate(‘activerecord.errors.messages.too_short’) % range.first
  • :long_message - value the test expects to find in errors.on(:attribute). Regexp or string. Default = I18n.translate(‘activerecord.errors.messages.too_long’) % range.last

Example:

  should_ensure_length_in_range :password, (6..20)

Deprecated: use ActiveRecord::Matchers#ensure_length_of instead.

Ensures that the length of the attribute is exactly a certain length

Options:

  • :message - value the test expects to find in errors.on(:attribute). Regexp or string. Default = I18n.translate(‘activerecord.errors.messages.wrong_length’) % length

Example:

  should_ensure_length_is :ssn, 9

Deprecated: use ActiveRecord::Matchers#ensure_inclusion_of instead.

Ensure that the attribute is in the range specified

Options:

  • :low_message - value the test expects to find in errors.on(:attribute). Regexp or string. Default = I18n.translate(‘activerecord.errors.messages.inclusion’)
  • :high_message - value the test expects to find in errors.on(:attribute). Regexp or string. Default = I18n.translate(‘activerecord.errors.messages.inclusion’)

Example:

  should_ensure_value_in_range :age, (0..100)

Deprecated: use ActiveRecord::Matchers#have_and_belong_to_many instead.

Ensures that the has_and_belongs_to_many relationship exists, and that the join table is in place.

  should_have_and_belong_to_many :posts, :cars

Deprecated.

Ensure that the given class methods are defined on the model.

  should_have_class_methods :find, :destroy
should_have_db_column(*columns)

Deprecated: use ActiveRecord::Matchers#have_db_column instead.

Ensure that the given columns are defined on the models backing SQL table. Also aliased to should_have_db_column for readability. Takes the same options available in migrations: :type, :precision, :limit, :default, :null, and :scale

Examples:

  should_have_db_columns :id, :email, :name, :created_at

  should_have_db_column :email,  :type => "string", :limit => 255
  should_have_db_column :salary, :decimal, :precision => 15, :scale => 2
  should_have_db_column :admin,  :default => false, :null => false
should_have_db_index(*columns)

Deprecated: use ActiveRecord::Matchers#have_db_index instead.

Ensures that there are DB indices on the given columns or tuples of columns. Also aliased to should_have_db_index for readability

Options:

  • :unique - whether or not the index has a unique constraint. Use true to explicitly test for a unique constraint. Use false to explicitly test for a non-unique constraint. Use nil if you don‘t care whether the index is unique or not. Default = nil

Examples:

  should_have_db_indices :email, :name, [:commentable_type, :commentable_id]
  should_have_db_index :age
  should_have_db_index :ssn, :unique => true

Deprecated.

Ensure that the given instance methods are defined on the model.

  should_have_instance_methods :email, :name, :name=

Deprecated: use ActiveRecord::Matchers#have_many instead.

Ensures that the has_many relationship exists. Will also test that the associated table has the required columns. Works with polymorphic associations.

Options:

  • :through - association name for has_many :through
  • :dependent - tests that the association makes use of the dependent option.

Example:

  should_have_many :friends
  should_have_many :enemies, :through => :friends
  should_have_many :enemies, :dependent => :destroy

Deprecated: use ActiveRecord::Matchers#have_one instead.

Ensure that the has_one relationship exists. Will also test that the associated table has the required columns. Works with polymorphic associations.

Options:

  • :dependent - tests that the association makes use of the dependent option.

Example:

  should_have_one :god # unless hindu

Deprecated: use ActiveRecord::Matchers#have_readonly_attribute instead.

Ensures that the attribute cannot be changed once the record has been created.

  should_have_readonly_attributes :password, :admin_flag

Deprecated: use ActiveRecord::Matchers#allow_mass_assignment_of instead.

Ensures that the attribute cannot be set on mass update.

  should_not_allow_mass_assignment_of :password, :admin_flag

Deprecated: use ActiveRecord::Matchers#allow_value instead.

Ensures that the attribute cannot be set to the given values

Options:

  • :message - value the test expects to find in errors.on(:attribute). Regexp or string. If omitted, the test will pass if there is ANY error in errors.on(:attribute).

Example:

  should_not_allow_values_for :isbn, "bad 1", "bad 2"

Deprecated: use ActiveRecord::Matchers#validate_acceptance_of instead.

Ensures that the model cannot be saved if one of the attributes listed is not accepted.

Options:

  • :message - value the test expects to find in errors.on(:attribute). Regexp or string. Default = I18n.translate(‘activerecord.errors.messages.accepted’)

Example:

  should_validate_acceptance_of :eula

Deprecated: use ActiveRecord::Matchers#validate_numericality_of instead.

Ensure that the attribute is numeric

Options:

  • :message - value the test expects to find in errors.on(:attribute). Regexp or string. Default = I18n.translate(‘activerecord.errors.messages.not_a_number’)

Example:

  should_validate_numericality_of :age

Deprecated: use ActiveRecord::Matchers#validate_presence_of instead.

Ensures that the model cannot be saved if one of the attributes listed is not present.

Options:

  • :message - value the test expects to find in errors.on(:attribute). Regexp or string. Default = I18n.translate(‘activerecord.errors.messages.blank’)

Example:

  should_validate_presence_of :name, :phone_number

Deprecated: use ActiveRecord::Matchers#validate_uniqueness_of instead.

Ensures that the model cannot be saved if one of the attributes listed is not unique. Requires an existing record

Options:

  • :message - value the test expects to find in errors.on(:attribute). Regexp or string. Default = I18n.translate(‘activerecord.errors.messages.taken’)
  • :scoped_to - field(s) to scope the uniqueness to.
  • :case_sensitive - whether or not uniqueness is defined by an exact match. Ignored by non-text attributes. Default = true

Examples:

  should_validate_uniqueness_of :keyword, :username
  should_validate_uniqueness_of :name, :message => "O NOES! SOMEONE STOELED YER NAME!"
  should_validate_uniqueness_of :email, :scoped_to => :name
  should_validate_uniqueness_of :address, :scoped_to => [:first_name, :last_name]
  should_validate_uniqueness_of :email, :case_sensitive => false

[Validate]