Хороший вопрос.Прежде чем тестовый каркас (Test :: Unit) запускает каждый тест, он сбрасывает базу данных в исходное состояние.Поэтому перед каждым тестом вам гарантируется, что в БД есть только данные о приборах и ничего больше.
Это полезно.Вы не хотите, чтобы данные из одного теста оставались там, когда вы начинаете следующий тест.Если бы это было так, состояние БД было бы несовместимым, если бы вы сделали что-то вроде запуска теста самостоятельно (вместо всего набора) или запуска тестов в другом порядке.
Решение: вы можете написать тест, которыйспециально проверяет, что: username и: email уникальны.Прежде чем привести пример, я должен упомянуть, что, похоже, вы написали функциональный тест для этой проверки.Это заманчиво, потому что вы проверяете поведение, которое увидит пользователь, но место для проверки валидации находится в модульных тестах, потому что правила валидации в Rails распространяются на модели.(Чтобы сохранить проверку СУХОЙ. Вам не нужно дублировать свои правила проверки для нескольких контроллеров)
Итак, вот один способ, которым вы можете написать модульный тест:
test "should validate unique email" do
attributes = { :username => "newuser", :email => "newuser@gmail.com", :password => "secret", :password_confirmation => "secret" }
# create user
user1 = User.create(attributes)
assert_nil user1.errors.on(:username)
assert_nil user1.errors.on(:email)
# create another user with the same name and email
user2 = User.create(attributes)
assert_not_nil user2.errors.on(:username)
assert_not_nil user2.errors.on(:email)
end
ДляХорошая статья об этом, см. пост в блоге Джона Нунемейкера, опубликованный два года назад .Не обращайте внимания на случайные теги HTML в его примерах кода.Nunemaker - замечательный блогер Rails.
Есть несколько альтернативных библиотек тестирования, таких как Shoulda, которые имеют встроенные функции для проверки того, что ваша модель проверяет уникальность.Но поскольку вы новичок в Rails, я бы порекомендовал придерживаться тестовой среды по умолчанию.(На самом деле люди из 37Signals, которые изобрели Rails, по-прежнему также используют значение по умолчанию, так что это говорит о многом. Я также предпочитаю придерживаться значения по умолчанию.)
Кстати, вы можете форматировать код вЗадать вопрос StackOverflow, сделав отступ в четыре пробела.