Сообщение об ошибке после реализации has_secure_password
Я разработал несколько тестов в Rails, которые работают нормально. Затем я добавил:
- В файле модели: has_secure_password
- В файле Gem: gem 'bcrypt', '3.1.7' (после установки пакета он появляется в Gemfile.lock)
- Я добавил password_digest в качестве строки в файл миграции (и после миграции он действительно отображается в schema.rb)
И я добавил пароль и password_confirmation для установки в тестовом файле:
def setup
@user = User.new(email: "user@example.com",
username: "example user",
firstname: "Allan",
location: "Europe",
password: "foobar",
password_confirmation: "foobar")
end
Теперь, когда я бегу rake test
Я получаю ошибки, говоря:
NoMethodError: undefined method 'password_digest=' for #<User:0x00000002f9c020> test/models/user_test.rb:6:in 'setup'.
Строка 6 ссылается на строку @user = User.new ...
Похоже, что он правильно реализовал гем и дополнительный столбец, и все же я получаю это сообщение об ошибке. У кого-нибудь есть идея, в чем может быть причина?
1 ответ
Кажется, вы изменили и повторно запустили существующую миграцию. В этом случае ваша тестовая база данных не синхронизирована с вашей базой данных dev. Вам необходимо загрузить свою схему в тестовую базу данных с помощью:
rake db:test:prepare
Объяснение:
В разработке рельсов у вас есть две совершенно разные среды - тестирование и разработка. Разработка - это среда, которую вы используете для просмотра написанного - это значение по умолчанию для rails s
а также rails c
, Тестовая среда используется только для тестирования. Эти среды имеют две отдельные базы данных.
До недавнего времени каждый раз, когда вы создавали миграцию, вам приходилось запускать ее дважды, по одному для каждой среды (чтобы обе базы данных были синхронизированы) или, по крайней мере, загружать схему базы данных для тестирования базы данных. Новейшая версия rails немного умнее - прежде чем запускать тесты, она проверит, все ли миграции были выполнены, и затем, соответствует ли версия тестовой базы данных базе данных dev. Если нет, он обновит тестовую базу данных из схемы.
Поскольку вы перезапускаете существующую миграцию, обе базы данных дали одну и ту же версию, поэтому тестовая база данных не обновлялась автоматически, поэтому необходимо обновить ее вручную.