1

次の分類モデルがあります。

# Mass assignable fields
attr_accessible :name, :classification, :is_shown

# Add validation
validates :name,           :presence => true, :uniqueness => true
validates :classification, :presence => true

rspec + capybara を使用して、一意性バリデーターをテストしたいと考えています。

Taxonomy.create(:name => 'foo', :classification => 'activity').save!(:validate => false)
it { should validate_uniqueness_of(:name).scoped_to(:classification) }

このテストは次のエラーで失敗します。

Failure/Error: it { should validate_uniqueness_of(:name).scoped_to(:classification) }
Expected errors to include "has already been taken" when name is set to "foo", got errors: ["name has already been taken (\"foo\")", "classification is not included in the list (:activitz)"] (with different value of classification)
 # ./spec/models/taxonomy_spec.rb:14:in `block (3 levels) in <top (required)>'

テストに合格するはずです。私は何が欠けていますか?

4

1 に答える 1

1

これはモデル仕様を扱っているため、これはカピバラの質問ではありません。これらの特別な検証マッチャーを利用するために、 shoulda マッチャー gemを使用していると思います。ActiveRecord

あなたの例のようなモデルを考えると:

class Taxonomy < ActiveRecord::Base
  validates :name,           :presence => true, :uniqueness => true
  validates :classification, :presence => true
end

次の仕様になります。

describe Taxonomy do
  it { should validate_presence_of(:name) }
  it { should validate_uniqueness_of(:name) }
  it { should validate_presence_of(:classification) }
end

ただし、名前フィールドの一意性を分類に限定したい場合は、次のようにします。

class Taxonomy < ActiveRecord::Base
  validates :name,           :presence => true, :uniqueness => { :scope => :classification }
  validates :classification, :presence => true
end

...そして次の仕様:

describe Taxonomy do
  it { should validate_presence_of(:name) }
  it { should validate_uniqueness_of(:name).scoped_to(:classification) }
  it { should validate_presence_of(:classification) }
end
于 2013-04-15T18:27:52.553 に答える