Возникли проблемы при проверке моделей Rails с помощью musta-matchers и factory-girl-rails? - PullRequest
0 голосов
/ 24 августа 2018

Модель:

validates :email,
uniqueness: {
  message: "has been taken."
},
presence: {
  message: "cannot be blank."
},
length: {
  minimum: 3,
  message: "is too short, must be a minimum of 3 characters.",
  allow_blank: true
},
format: {
  with: /\A[A-Z0-9_\.&%\+\-']+@(?:[A-Z0-9\-]+\.)+(?:[A-Z]{2,13})\z/i,
  message: "is invalid.",
  if: Proc.new { |u| u.email && u.email.length >= 3 }
}

RSpec:

before(:each) do
  @user = FactoryGirl.build(:user)
end

it { should validate_length_of(:email).is_at_least(3) }

Ошибка:

Failure/Error: should validate_length_of(:email).is_at_least(3)
   Expected errors to include "is too short (minimum is 3 characters)" when email is set to "xx",
   got errors:
   * "is too short (minimum is 4 characters)" (attribute: password, value: nil)
   * "is too short, must be a minimum of 3 characters." (attribute: email, value: "xx")
   * "is not included in the list" (attribute: state, value: "passive")

Завод:

factory :user, class: User do
  email FFaker::Internet.email
  password FFaker::Internet.password
  username FFaker::Internet.user_name

end

Я используюfactory_girl_rails с musta_matchers.Каждый раз, когда я пытаюсь подтвердить свою электронную почту, я получаю сообщение об ошибке, как указано выше.В нем говорится, что значение электронной почты равно «xx», но длина заводской электронной почты больше этой.Как я могу написать rspec, который пройдет?

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Ifa-matchers проверяет проверки, проверяя сообщения в объекте ошибок.

Сопоставители проверки работают только с сообщениями об ошибках по умолчанию для rails, если не указано иное:

it { should validate_length_of(:email).with_message("is too short, must be a minimum of 3 characters.") }

The *Метод 1006 * подробно описан в этом комментарии .

0 голосов
/ 25 августа 2018

Вы неправильно понимаете ошибку (и ее причину).Ошибка говорит о том, что она ожидает «слишком короткая (минимум 3 символа)», но в ошибках она не может найти эту строку (rspec находит «слишком короткая, должна быть не менее 3 символов». Это то, что вы определилипо вашей проверке).

Когда вы используете совпадения musta и говорите

it { should validate_length_of(:email).is_at_least(3) }

Я предполагаю, что это создает тест с электронной почтой короче 3 и проверяет, не сработает ли он, поэтомуигнорируя вашу фабрику, внутренне следует, что matcher устанавливает строку фиксированной длины только для того, чтобы пройти этот тест.

Когда вы видите ошибки пользователя, этот тест должен действительно работать, так как ошибка на самом деле есть, только строкаразные.Итак, у вас есть два варианта: удалить пользовательское сообщение, когда длина минимальна: 3;или сообщите собеседнику, какое сообщение вы ожидаете:

it { should validate_length_of(:email).is_at_least(3).with_message("is too short, must be a minimum of 3 characters.") }
...