2014-12-27 3 views
1

Я следую руководству Rails Майкл Хартл. В chapter 6 мы создаем тест проверки длины для имени пользователя и электронной почты.Как эта проверка длины работает в Ruby on Rails?

В тестовом/модели/файла user_test.rb он говорит, чтобы написать

test "name should not be too long" do 
@user.name = "a" * 51 
assert_not @user.valid? 
end 

, а затем в приложение/модели/user.rb мы помещаем

class User < ActiveRecord::Base 
validates :name, presence: true, length: { maximum: 50 } 

Мой вопрос, как же тест гарантирует, что имя не, например, 60 символов? Я получаю, что проверка подтверждает, что максимальная длина 50, но в тесте говорится, что пользователь недействителен, если user.name EQUALS 51 символов ... не больше или равно.

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

ответ

2

В тестах вам необходимо убедиться, что ваш код делает все так, как вы ожидаете. В этом случае вы не сможете сохранить пользователя с name, длина которого превышает 50 символов. Вот почему в тесте вы проверяете, что пользователь становится недействительным с name длиной == 51 символом.

Но вы также верны, что этот тест не гарантирует, что пользователь с длиной имени 60 также недействителен. Он также не проверяет, что 50 является максимальным, поскольку он будет проходить для

validates :name, presence: true, length: { maximum: 1 } 

например. Но вы, вероятно, не хотите, чтобы ваше приложение вел себя так. Вот почему я призываю вас, чтобы добавить еще один чек на максимально допустимую длину:

@user.name = "a" * 50 
assert @user.valid? 

Обычно, если вы сомнения, что что-то может быть неправильно в вашем коде, вы можете добавить новые тесты. Но в этом случае вам не следует проверять, как работает код, потому что проверки на наличие/длину хорошо протестированы в Rails. Вы должны просто проверить, что вы включили такие проверки в свою модель с правильными аргументами. Например, в shoulda-matchers у вас есть эти помощники:

should validate_presence_of(:name) 
should validate_length_of(:name).is_at_most(50) 

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

1

Тест просто утверждает, что имя пользователя с 51 символом не должно быть действительным.

Тест не гарантирует, что имя пользователя не может содержать 60 символов. Вот что делает фактический код проверки.

Например, если вы изменили код проверки на это:

class User < ActiveRecord::Base 
validates :name, presence: true, length: { maximum: 60 } 

то тест потерпит неудачу, потому что код является проверки имени пользователя с 51 символами.

Смежные вопросы