Я настраиваю спецификации для своих форм (используя Reform
драгоценный камень) с RSpec
и Shoulda Matchers
драгоценными камнями. Я не могу понять, почему у меня проблемы с проверкой.
Мои фактические конфигурации:
ruby '2.5.1'
gem 'rails', '~> 5.2.0'
gem 'rspec-rails', '~> 3.8'
gem 'shoulda-matchers', '~> 4.0'
gem 'reform-rails', '~> 0.1'
Я уже пробовал разные виды проверки длины в своей форме. Но ничего не делает вещи намного лучше.
Вот минимальная форма, используемая для тестирования:
# frozen_string_literal: true
class UserForm < Reform::Form
# == Properties ==========================================================
property :nickname
# == Validations ==========================================================
validates :nickname, presence: true, length: { minimum: 3, maximum: 100 }
end
Вот спецификация:
# frozen_string_literal: true
RSpec.describe UserForm, type: :model do
subject { described_class.new(User.new) }
it { is_expected.to validate_presence_of :nickname }
it { is_expected.to validate_length_of(:nickname).is_at_least(3).is_at_most(100) }
end
Обратите внимание, что сопоставитель validate_presence_of
работает отлично.
У меня есть выход RSpec
:
1) UserForm should validate that the length of :nickname is between 3 and 100
Failure/Error: it { is_expected.to validate_length_of(:nickname).is_at_least(3).is_at_most(100) }
Expected UserForm to validate that the length of :nickname is between
3 and 100, but this could not be proved.
After setting :nickname to ‹"xxx"›, the matcher expected the
UserForm to be valid, but it was invalid instead, producing these
validation errors:
* nickname: ["is too short (at least 3 characters)"]
Я, очевидно, исключаю, чтобы такие проверки работали.
Я надеюсь, что смогу найти здесь помощь :)
Известно, что реформа не работает с исполнителями. По сути, все сопоставители моделей в shoulda-matchers работают следующим образом:
validate
на этом экземпляре.errors
.Однако Реформа так не работает; вы не устанавливаете свойства объекта формы по отдельности, а затем вызываете valid?
, вы вызываете validate
со свойствами, которые вы хотите установить для объекта формы, а затем эти свойства проверяются в процессе установки. Вероятно, поэтому вы получаете эту ошибку — потому что shoulda-matchers пытается вручную установить свойства, а затем validate
сдувает их.
К сожалению, нет никакого способа заставить работать с Reform-ом, не написав какой-нибудь адаптер. Мы не планируем добавлять это в драгоценный камень в ближайшее время, но мы сделаем PR! Помимо этого, очевидно, команда Reform говорила о том, чтобы сделать несколько сопоставителей RSpec в духе должно-сопоставителей, но я не уверен, насколько там был достигнут прогресс, если он вообще есть.
Извините, я не мог быть более полезным :/
Есть ли какой-либо другой метод, работающий как обратный вызов
before_validation
, который влияет на длину поляnickname
? Не могли бы вы поделиться кодом, связанным с обратным вызовом, если таковой имеется?