我有以下任务模型:
class Task < ApplicationRecord
validates :body, presence: true, length: { minimum: 10 }
validates :complete, presence: true
end
并遵循FactoryGirl对象创建代码:
FactoryGirl.define do
factory :incomplete_task, class: :Task do
body { Faker::Pokemon.name + Faker::Pokemon.name }
complete false
factory :complete_task do
complete true
end
end
end
在我的任务控制器测试中,我有:
describe '#update' do
it 'toggles completion' do
incomplete_task = create :incomplete_task
toggle_completion(incomplete_task)
expect(incomplete_task.complete).to be_true
end
end
然而,由于该字段“完成”而失败了。 FG创建的任务对象中缺少:
Failures:
1) TasksController#update toggles completion
Failure/Error: incomplete_task = create :incomplete_task
ActiveRecord::RecordInvalid:
Validation failed: Complete can't be blank
这里发生了什么?我正确设置了完整的属性,并且正在检查正常。这也是任务模式:
# Table name: tasks
#
# id :integer not null, primary key
# created_at :datetime not null
# updated_at :datetime not null
# body :text
# complete :boolean
答案 0 :(得分:0)
在ruby中,false
被视为空白(不存在)值(以及nil
,空字符串/数组和其他空值)。因此,在线验证器正确拒绝该记录。
documentation有以下评论:
如果要验证是否存在布尔字段(实际值为
true
和false
),则需要使用validates_inclusion_of :field_name, in: [true, false]
。这是由于
Object#blank?
处理布尔值的方式:false.blank? # => true
。