1

モデルでテストしようとしているメソッドがありますが、うまく機能していません。必要なときに false を返していないようです。何か提案はありますか?

class Registration < ActiveRecord::Base
validate :check_duplicate_section
def check_duplicate_section
    all_registrations = Registration.all
    all_registrations.each do |reg|
        puts reg.section_id
        if reg.section_id == self.section_id && reg.student_id == self.student_id 
        errors.add(:registration, "Already exists")
        return false
        end
    return true
end
end

テスト ファイル: (@bruce は前に定義されています)

class RegistrationTest < ActiveSupport::TestCase

should "not allow invalid student registrations" do
    @mike = FactoryGirl.create(:student, :first_name => "Mike")
    good_reg = FactoryGirl.build(:registration, :section => @section2, :student => @mike)
    bad_reg = FactoryGirl.build(:registration, :section => @section1, :student => @bruce)
    bad_reg2 = FactoryGirl.build(:registration, :section => @section2, :student => @mike)
    assert_equal true, good_reg.valid?
    assert_equal false, bad_reg.valid?
    assert_equal false, bad_reg2.valid?
4

1 に答える 1

1

何をしようとしているのかという見た目からcheck_duplicate_section、組み込みのuniqueness検証を使用することをお勧めします

validates :section_id, uniqueness: { scope: :user_id }

これを使用したくない場合は、メソッドを次のように変更してください

def check_duplicate_section
  if Registration.where(section_id: self.section_id, student_id: self.student_id).exists?
    errors.add :registration, "Already exists"
  end
end

また、テストではbuild、データベースに何も保存しないものを使用しています。createデータベースクエリの戻り値を強制するには、モックを使用する必要があります。

組み込みの検証アプローチを使用することの良い点は、機能するはずなのでテストする必要がないことです。

于 2013-03-04T01:58:09.920 に答える