更新时也会触发Rails 5验证

时间:2019-02-05 16:15:59

标签: ruby-on-rails ruby ruby-on-rails-5

我正在使用工厂bot gem构建用于rspec测试的工厂对象。我的模型中有一个像这样的验证:

validates :reason_for_change, presence: true, on: :update

规格测试失败,因为无法创建对象本身:

Failure/Error: let(:user) { create(:super_user) }

     ActiveRecord::RecordInvalid:
       Validation failed: Profile reason for change can't be blank

我也尝试过这个:

validates :reason_for_change, presence: true, unless: :new_record?

相同错误。也是如此:

validates :reason_for_change, presence: true, if: :my_custom_method

def my_custom_method
  !new_record?
end

相同的结果。但是,当我使用上一次验证并将断点放在我的自定义方法中时:

def my_custom_method
  binding.pry
end

并且首先手动检查这是一个new_record?,只要它评估为true,我都会返回false(手动输入)。对于每一个错误的评估,我都会返回true(手动输入)。

在这种情况下,所有测试均通过。这里发生了什么?我正在使用滑轨5.0.1

更新1:

这是我的超级用户工厂:

factory :super_user do
    transient do
      email { nil }
    end
    first_name { Faker::Name.first_name }
    last_name  { Faker::Name.last_name }
    gender { 'male' }
    age { Random.rand(18..40) }
    ethnicity { '' }
    avatar { Rack::Test::UploadedFile.new(Rails.root.join('spec/files/1.png')) }
  end

我也不认为我应该修改工厂,只是为了使这项工作生效。这应该可以。

1 个答案:

答案 0 :(得分:1)

我的评论的复制粘贴: 请检查日志。我相信,您会看到类似这样的内容:

INSERT INTO super_users () VALUES(...) 
UPDATE super_users SET filed = val 

如果是这样-请检查保存记录时可能运行的其他回调。我的猜测是,您还有另一个回调,例如after_save回调会更新相同的记录。 在尝试我的建议之前,您应该先禁用该验证。