2016-03-08 3 views
6

В моей фабрике у меня есть логическое поле (оценивается), которое я пытаюсь установить на false. Я хочу, чтобы поле было необходимо, и всегда устанавливается либо истинный или ложнойFactoryGirl: присвоение значения false для логического

Модель

validates_presence_of :evaluated 

завод

FactoryGirl.define do 
    factory :submission do 
    evaluated true 
    score 1.5 
    ranking 1.5 
    submission_type "user" 
    . 
    . 
    end 
end 

В тесте

it { should validate_presence_of(:evaluated) } 

Когда я бегу это

 Failure/Error: expect(@submission).to be_valid 
    expected #<Submission id: nil, competition_id: 163, user_id: 134, team_id: nil, evaluated: false, score: 1.5, ranking: 1.5, submission_type_cd: "user", withdrawn: true, withdrawn_date: "2016-02-08", created_at: nil, updated_at: nil> to be valid, but got errors: Evaluated can't be blank 

Если изменить значение истинно, то тест проходит

evaluated true 

Как я могу создать завод с ложными значениями Booleans?

+2

Это больше, что вы не можете проверить наличие булевы. 'False.present? => false' –

+0

Итак, лучший вариант - добавить его как нуль на уровне db? – ardochhigh

+0

Да, вот что я сделал бы –

ответ

12

Я предпочел бы использовать проверку inclusion_of вместо presence валидация.

С рельсов doc,

Если вы хотите, чтобы проверить наличие булева поля (где реальные значения являются истинными и ложными), вы будете хотеть использовать

validates_inclusion_of :field_name, in: [true, false]

Этот связано с тем, как Object#blank? обрабатывает булевы значения

т.е. false.blank? # => true

Тогда ваше испытание было бы что-то подобное,

it { should ensure_inclusion_of(:field_name).in_array([true, false]) }