Должен ли сопоставлять `validate_length_of` в RSpec с формой Reform

Я настраиваю спецификации для своих форм (используя 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)"]

Я, очевидно, исключаю, чтобы такие проверки работали.

Я надеюсь, что смогу найти здесь помощь :)

Есть ли какой-либо другой метод, работающий как обратный вызов before_validation, который влияет на длину поля nickname? Не могли бы вы поделиться кодом, связанным с обратным вызовом, если таковой имеется?

Anuj Khandelwal 09.04.2019 08:58
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
1 655
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Известно, что реформа не работает с исполнителями. По сути, все сопоставители моделей в shoulda-matchers работают следующим образом:

  • Создание нового экземпляра тестируемого класса.
  • Установка атрибутов для этого экземпляра.
  • Вызов validate на этом экземпляре.
  • Чтение любых возможных ошибок проверки из errors.

Однако Реформа так не работает; вы не устанавливаете свойства объекта формы по отдельности, а затем вызываете valid?, вы вызываете validate со свойствами, которые вы хотите установить для объекта формы, а затем эти свойства проверяются в процессе установки. Вероятно, поэтому вы получаете эту ошибку — потому что shoulda-matchers пытается вручную установить свойства, а затем validate сдувает их.

К сожалению, нет никакого способа заставить работать с Reform-ом, не написав какой-нибудь адаптер. Мы не планируем добавлять это в драгоценный камень в ближайшее время, но мы сделаем PR! Помимо этого, очевидно, команда Reform говорила о том, чтобы сделать несколько сопоставителей RSpec в духе должно-сопоставителей, но я не уверен, насколько там был достигнут прогресс, если он вообще есть.

Извините, я не мог быть более полезным :/

Другие вопросы по теме