Rails 3 Tutorial Глава 11 «Ошибка проверки: электронная почта уже получена» - PullRequest
9 голосов
/ 15 марта 2011

Моя проблема возникла в главе 11 учебника по Ruby on Rails здесь .

Я видел эту ошибку rspec:

Failure/Error: :user => Factory(:user, :email => Factory.next(:email)))
     ActiveRecord::RecordInvalid:
       Validation failed: Email has already been taken

сначала в user_spec.rb, затем в micropost_spec.rb. Это было довольно загадочно. Я думал, что фабричные операторы генерируют пользователя в новой тестовой базе данных каждый раз, когда автотест запускает rspec. Я извлек исходные файлы из основной ветки с помощью git и попробовал еще раз, но увидел ту же ошибку. Поэтому я подозревал, что это как-то связано с содержанием БД, а не с кодом.

Итак, я сделал следующее:

restarted "rails s"  
restarted autotest  
rake db:reset  
rake db:migrate  
rake db:test:prepare  
rake db:populate  

... и все стало зеленым. Тесты rspec пройдены.

Может быть, есть более «конкретное» решение, но я был взволнован, это сработало. Надеюсь, это поможет кому-то еще. Мне осталось сделать вывод, что мое тестирование / разработка каким-то образом добавило в базу данных что-то неожиданное. Я полагаю, что вышеописанные шаги - хороший способ сделать себе свежую базу данных ближе к концу главы 11.

Был ли более прямой способ решить эту проблему? Указывает ли ошибка на какую-то другую проблему, которую я решил, не осознавая этого? Мне кажется, что запуск rspec не гарантирует каждый раз новое тестирование БД. Это неправильное предположение?

Ответы [ 5 ]

12 голосов
/ 24 апреля 2011

У меня были проблемы с интеграционными тестами вскоре после главы 9.4. Все мои тесты контроллера и тест интеграции запроса закончились с сообщением «Электронная почта уже была взята»

Что я узнал из RailsTutorial - глава 8.4.3 - Тестовая база данных не очищается после добавления пользователя в интеграционном тесте : вам нужно что-то сделать для очистки после интеграционных тестов, потому что в отличие от модульных тестов они могут не убирай за собой.

Представленное решение заключалось в использовании гема DatabaseCleaner , реализация которого также объясняется в связанном Вопросе.

Я думаю, что если вы не реализуете какую-либо стратегию очистки после интеграционного теста, вам по-прежнему придется использовать решение «дробовик» для очистки БД при каждом запуске набора тестов. Определенно не весело.

4 голосов
/ 17 ноября 2012

Это работает для меня:

bundle exec rake db:test:prepare

Это также в учебнике.

2 голосов
/ 31 марта 2013

Мне показалось, что проблема связана с Spork. После перезапуска я могу запускать тесты столько раз, сколько мне нужно.

1 голос
/ 17 января 2014

Помогло, добавил в файл factories

sequence(:email) {|n| "person#{n}@example.com" }
0 голосов
/ 13 июня 2018

В моем случае проблема была в равных письмах в

factory :user

и

factory :user_with_additional_options
...