1

モデル:

class Contact < ActiveRecord::Base
  validates :gender, :inclusion => { :in => ['male', 'female'] }
end

移行:

class CreateContacts < ActiveRecord::Migration
  def change
    create_table "contacts", :force => true do |t|
      t.string  "gender",  :limit => 6, :default => 'male'
    end
  end
end

RSpec テスト:

describe Contact do
  it { should validate_inclusion_of(:gender).in(['male', 'female']) }
end

結果:

Expected Contact to be valid when gender is set to ["male", "female"]

この仕様が通らない理由を知っている人はいますか? または、誰かがそれを再構築して (無効に) 検証できますか? ありがとうございました。

4

3 に答える 3

2

の使い方を誤解していました.in(..)。値の配列を渡すことができると思っていましたが、単一の値しか受け入れないようです:

describe Contact do
  ['male', 'female'].each do |gender|
    it { should validate_inclusion_of(:gender).in(gender) }
  end
end

ただし、使用することの違いは何なのかよくわかりませんallow_value

['male', 'female'].each do |gender|
  it { should allow_value(gender).for(:gender) }
end

また、許可されていない値も確認することをお勧めします。

[:no, :valid, :gender].each do |gender| it { should_not validate_inclusion_of(:gender).in(gender) } end

于 2012-07-09T13:49:55.203 に答える
1

私は通常、これらのことを直接テストすることを好みます。例:

%w!male female!.each do |gender|
  it "should validate inclusion of #{gender}" do
    model = Model.new(:gender => gender)
    model.save
    model.errors[:gender].should be_blank
  end
end

%w!foo bar!.each do |gender|
  it "should validate inclusion of #{gender}" do
    model = Model.new(:gender => gender)
    model.save
    model.errors[:gender].should_not be_blank
  end
end
于 2012-06-26T15:32:25.557 に答える
0

使用する必要がありますin_array

ドキュメントから:

  # The `validate_inclusion_of` matcher tests usage of the
  # `validates_inclusion_of` validation, asserting that an attribute can
  # take a whitelist of values and cannot take values outside of this list.
  #
  # If your whitelist is an array of values, use `in_array`:
  #
  #     class Issue
  #       include ActiveModel::Model
  #       attr_accessor :state
  #
  #       validates_inclusion_of :state, in: %w(open resolved unresolved)
  #     end
  #
  #     # RSpec
  #     describe Issue do
  #       it do
  #         should validate_inclusion_of(:state).
  #           in_array(%w(open resolved unresolved))
  #       end
  #     end
  #
  #     # Test::Unit
  #     class IssueTest < ActiveSupport::TestCase
  #       should validate_inclusion_of(:state).
  #         in_array(%w(open resolved unresolved))
  #     end
  #
  # If your whitelist is a range of values, use `in_range`:
  #
  #     class Issue
  #       include ActiveModel::Model
  #       attr_accessor :priority
  #
  #       validates_inclusion_of :priority, in: 1..5
  #     end
  #
  #     # RSpec
  #     describe Issue do
  #       it { should validate_inclusion_of(:state).in_range(1..5) }
  #     end
  #
  #     # Test::Unit
  #     class IssueTest < ActiveSupport::TestCase
  #       should validate_inclusion_of(:state).in_range(1..5)
  #     end
  #
于 2015-05-27T18:29:33.990 に答える