导轨上产生太多更新火灾5验证

问题描述 投票:0回答:1

我使用的工厂机器人宝石搭建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?,每当它会评估为真,我将返回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

此外,我不认为我应该修改的工厂,只是为了使这项工作。这应该工作。

ruby-on-rails ruby ruby-on-rails-5
1个回答
1
投票

我的评论的复制粘贴:请检查日志。我相信,你会看到有这样的事情:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.