Я использую фабричный бот для создания своих фабричных объектов для теста 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?
, когда бы он ни оценивался как true, я возвращал false(печатать вручную).И для каждого оцениваемого 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
Также я надеваюне думаю, что я должен изменить фабрику, просто чтобы сделать эту работу.Это должно работать.