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 回答