Не удалось проверить Devise с Capybara
Я создаю приложение Rails 3, используя Devise, с Capybara для тестирования пользовательского интерфейса. Не выполняется следующее тестирование:
class AuthenticationTest < ActionController::IntegrationTest
def setup
@user = User.create!(:email => '[email protected]',
:password => 'testtest',
:password_confirmation => 'testtest')
@user.save!
Capybara.reset_sessions!
end
test "sign_in" do
# this proves the user exists in the database ...
assert_equal 1, User.count
assert_equal '[email protected]', User.first.email
# ... but we still can't log in ...
visit '/users/sign_in'
assert page.has_content?('Sign in')
fill_in :user_email, :with => '[email protected]'
fill_in :user_password, :with => 'testtest'
click_button('user_submit')
# ... because this test fails
assert page.has_content?('Signed in successfully.')
end
end
... но я понятия не имею, почему. Как видно из кода, пользователь создается в базе данных; Я использую тот же подход для создания пользователя, как и в seeds.rb.
Если я запустил тест через отладчик, я могу увидеть пользователя в базе данных и убедиться, что страница загружается. Но аутентификация завершается неудачно; Я могу проверить это, потому что, если я изменю утверждение для проверки на случай отказа, тест проходит:
# verify that the authentication actually failed
assert page.has_content?('Invalid email or password.')
Я привык к Rails 2 и использую Selenium для такого рода тестирования, поэтому я подозреваю, что делаю что-то глупое. Может ли кто-нибудь указать мне в правильном направлении здесь?
Ответы
Ответ 1
У меня была такая же проблема, и я нашел поток с решением:
RSpec.configure do |config|
config.use_transactional_fixtures = false
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
Для работы DatabaseCleaner вам нужно будет добавить драгоценный камень database_cleaner
. Если вы не использовали его раньше, вам может потребоваться rake db:test:prepare
, прежде чем повторять тесты. Я надеюсь, что это тоже сработает для вас!
Ответ 2
Раньше я сталкивался с подобной проблемой. Установка пароля напрямую имеет некоторые странные эффекты, потому что он должен быть зашифрован и храниться с солью - иногда это работает для меня, а в других случаях это не так. Мне трудно вспомнить, какие конкретные случаи были проблематичными. Я бы рекомендовал следующее, в этом порядке (для простоты)
- Убедитесь, что поле пароля правильно заполнено и передано в качестве правильного параметра (не обязательно, если вы используете самогенерированное представление Devise и не коснулись его)
- если ваш сайт может работать в режиме разработки (т.е. не регистрируется ошибок), а затем просто загрузите его и войдите вручную
- Если нет, вставьте
debugger
в качестве первой строки в sessions_controller
. Затем проверьте params
и убедитесь, что пароль верен и в params[:user][:password]
.
Если вы не переопределили Devise sessions_controller
, вы можете найти свой путь к Devise с помощью bundle show devise
. Затем найдите действие create
в (devise path)/app/controllers/devise/sessions_controller.rb
- Измените свою тестовую настройку, чтобы создать пользователя через веб-интерфейс, чтобы убедиться, что пароль установлен правильно, затем попробуйте снова запустить тест.
Ответ 3
У меня была такая же проблема с настройкой, довольно похожей на вашу. В моем случае переключение на сеансы ActiveRecord в инициализаторе решило проблему.
Кроме того, убедитесь, что вы вызываете @user.skip_confirmation! если вы используете "подтверждаемый" модуль в разработке.