Проверка Rails 5 при обновлении запускается и при создании - PullRequest
0 голосов
/ 05 февраля 2019

Я использую фабричный бот для создания своих фабричных объектов для теста 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

Также я надеваюне думаю, что я должен изменить фабрику, просто чтобы сделать эту работу.Это должно работать.

1 Ответ

0 голосов
/ 07 февраля 2019

Копия моего комментария: пожалуйста, проверьте логи.Я полагаю, вы увидите там что-то вроде этого:

INSERT INTO super_users () VALUES(...) 
UPDATE super_users SET filed = val 

Если это так - пожалуйста, проверьте другие обратные вызовы, которые могут выполняться при сохранении записи.Я предполагаю, что у вас есть другой обратный вызов, который обновляет ту же запись, например, в обратном вызове after_save.Вы должны отключить эту проверку, прежде чем пытаться мое предложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...