2014-02-06 2 views
0

Отказ от ответственности: название и атрибуты модели изменены из-за проблем с безопасностью!FactoryGirl создает экземпляры с дефектными атрибутами

class Human < ActiveRecord::Base 
    ... 

    attr_accessible :ssn 

    validates :ssn, uniqueness: { scope: ... } 

    validate :ssn_validator 

    def ssn_validator 
    #some regexp for checking 
    ... 
    end 
end 

И FactoryGirl фабрика:

FactoryGirl.define do  
    factory :human do 
    ssn '123456789' 
    end 
end 

И в моем тесте я испытываю мое ssn_validator, то есть создать несколько экземпляров человека с неправильными значениями Ssn.

class SisIdentifiableTest < ActiveSupport::TestCase 
    context 'human ssn' do 
    should 'be valid' do 
     assert FactoryGirl.build(:human).valid? 
    end 
    should 'be invalid if containing a & symbol' do 
     assert !FactoryGirl.build(:human, ssn:'12345678&').valid? 
    end 
    should 'be invalid if sorter than 9 symbols' do 
     assert !FactoryGirl.build(:human, ssn:'12345678').valid? 
    end 
    end 
end 

Результаты испытаний:

HumanTest 
    human ssn be valid        #pass 
    human ssn be invalid if containing a & symbol #fail 
    human ssn be invalid if sorter than 9 symbols #fail 

Во-первых, я думал, что мой ssn_validator как-то неисправно. Но это было не так.

Все человеческие экземпляры были действительны, потому что как-то ssn в действии? вызов был кеширован.

Я имею в виду, что это действительно? Метод испытания человеческого экземпляра против по умолчанию «123456789» действительное значение (предоставляется: человека завода), а не против предполагаемой ССН: «12345678» или ПЛА: «12345678 &»

В образце:

human = FactoryGirl.build(:human, ssn:'there be dragons') 
human.ssn    #'there be dragons' 
human.ssn_validator #false - because the sting is not valid 
human.valid?   #true 

Мой вопрос: Как проверить валидацию с помощью FactoryGirl? Есть ли другой метод, например, действительный? работая не против кешированных атрибутов? Или я создаю проверенные экземпляры с неправильным способом?

+0

Ваш образец проверяет значение, отличное от ваших тестов. Можете ли вы опубликовать тело своего валидатора SSN? Кроме того, действительно ли вам нужно изменить имена и атрибуты вашей модели? Это просто добавляет еще один слой, где вещи могут быть неверно переведены. –

ответ

0

FactoryGirl не предназначен для проверки валидации. Это удобство, чтобы помочь вам настроить тестовые данные. Метод build не приведет к какой-либо проверке модели, потому что он действительно делает только Human.new, а затем устанавливает атрибуты с вашего завода. Проверка не произойдет, пока вы на самом деле не попытаетесь сохранить модель.

(Метод FactoryGirl create бы проверить объект, как это так же, как Human.create, и поэтому должен сохранить объект. Опять же устанавливает атрибуты с завода.)

Возможно ли вы можете разместить код вашего метода ssn_validator? Например, делает ли он что-то вроде errors.add(:ssn, ...), если проверка не выполняется? Это необходимо для метода valid?, чтобы затем понять, что произошел сбой проверки.

Способ, которым я читал ваш вопрос, подразумевает, что ошибка находится в валидаторе. Когда вы говорите:

human ssn be invalid if containing a & symbol #fail 

Это означает, что ваша проверка не работает. Это пример недопустимого ssn, и если валидатор правильно подберет его, ваш тест, как ожидается, пройдет, а не обязательно.

Извините, если я неправильно понял ваш вопрос.

+0

Строка не вызывает проверки, но он также называет «действительным?» –

+0

Да, я знаю; Я имел в виду, что FactoryGirl сам по себе не предназначен для проверки валидации. То, что действительно? и не работает, подразумевает, что ошибка находится в методе ssn_validator. –

Смежные вопросы