0

私の学校のモデルには、その生徒との多数の関連付けと、ユーザー容量フィールドを持つライセンスとの 1 対 1 の関連付けがあります。学生のサイズをライセンス容量のサイズに制限するための検証を課したいので、次の設定を行いました。

class School < ActiveRecord::Base    

  has_one :license
  has_many :students

  delegate :user_capacity, :to => :license

  validate :within_user_capacity    

  def within_user_capacity
    return if students.blank?
    errors.add(:students, "too many") if students.size > user_capacity
  end    

end

これは、この検証をテストするために使用している仕様です。ユーザー容量を 100 と仮定します

it "should fail validation when student size exceeds school's user capacity" do
    school = FactoryGirl.create(:school_with_license)
    puts school.user_capacity # => 100
    puts school.students.size # => 0
    0...100.times {|i| school.students.build(...)}
    puts school.students.size # => 100
    #build the 101st student to trigger user capacity validation
    school.students.build(...).should_not be_valid
end

ただし、これは常に失敗します。次のメッセージが表示されます。

Failure/Error: school.students.build(...).should_not be_valid
       expected valid? to return false, got true

編集

FactoryGirl に問題があるようです。仕様内の puts ステートメントは、関連付けのサイズが増加していることを示していますが、検証がトリガーされたときにモデル内でさらにデバッグすると、増加していないことが示されます。ビルドされたレコードを仕様ループ内に明示的に保存したとしても。

4

2 に答える 2

1

build学校が無効であると主張したいときに、最後に追加された学生が無効であると主張しているようです (新しい学生を返します)。代わりに次のようなことをする必要がありますか?:

school.students.build(...)
school.should_not be_valid
于 2013-03-14T19:08:16.943 に答える
0

委任せずに、単純な検証を行うようにしてください。

私は自分のアプリケーションであなたのアプローチをチェックしました。それは通常、スティーブが彼の回答で提案した修正で機能します(School有効性をチェックする必要があります)。

したがって、次のコードをお勧めします。

class School < ActiveRecord::Base    
  has_many :students

  validate :within_user_capacity    

  def within_user_capacity
    errors.add(:students, "too many") if students.size > 1
  end    
end

次に、コンソールを開きます。RAILS_ENV=test rails c

> school = FactoryGirl.create :school
> school.valid?
=> true
> school.students.build
> school.students.size
=> 1
> school.valid?
=> true
> school.students.build
> school.students.size
=> 2
> school.valid?
=> false
> school.errors
=> ... @messages={:students=>["too many"]} ...

これが機能する場合は、Rspec コードを修正できます。

于 2013-03-15T05:03:21.117 に答える