Factory Girl失败状态验证

时间:2017-07-17 20:13:20

标签: ruby-on-rails factory-bot

我有以下任务模型:

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

1 个答案:

答案 0 :(得分:0)

在ruby中,false被视为空白(不存在)值(以及nil,空字符串/数组和其他空值)。因此,在线验证器正确拒绝该记录。

documentation有以下评论:

  

如果要验证是否存在布尔字段(实际值为truefalse),则需要使用validates_inclusion_of :field_name, in: [true, false]

     

这是由于Object#blank?处理布尔值的方式:false.blank? # => true