Неспособность проверить Devise с капибарой - PullRequest
12 голосов
/ 05 июля 2011

Я создаю приложение Rails 3, используя Devise, с Capybara для тестирования пользовательского интерфейса. Следующий тест не пройден:

class AuthenticationTest < ActionController::IntegrationTest

  def setup
    @user = User.create!(:email => 'test@example.com', 
                         :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 'test@example.com', 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 => 'test@example.com'
    fill_in :user_password, :with => 'testtest'
    click_button('user_submit')

    # ... because this test fails
    assert page.has_content?('Signed in successfully.')
  end

end

... но я понятия не имею, почему. Как видно из кода, пользователь создается в базе данных; Я использую тот же подход для создания пользователя, что и в seed.rb.

Если я запускаю тест через отладчик, я вижу пользователя в базе данных и проверяю, загружается ли страница. Но все равно аутентификация не удалась; Я могу проверить это, потому что если я изменю утверждение для проверки на случай сбоя, тест пройдёт:

# verify that the authentication actually failed
assert page.has_content?('Invalid email or password.')

Я привык к Rails 2 и использую Selenium для такого рода тестирования, так что я подозреваю, что делаю что-то глупое. Может ли кто-нибудь, пожалуйста, указать мне правильное направление здесь?

Ответы [ 3 ]

24 голосов
/ 22 июля 2011

У меня возникла та же проблема, и я нашел поток с решением :

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 перед повторным запуском тестов.Я надеюсь, что это работает и для вас!

3 голосов
/ 21 июля 2011

Я сталкивался с подобной проблемой раньше. Установка пароля напрямую имеет некоторые странные последствия, потому что он должен быть зашифрован и сохранен с солью - иногда это работает для меня, а иногда нет. Мне трудно вспомнить, какие конкретные случаи были проблематичными. Я бы порекомендовал следующее в этом порядке (для простоты)

  • Убедитесь, что поле пароля правильно заполнено и передано в качестве правильного параметра (необязательно, если вы используете автоматически сгенерированное представление Devise и не коснулись его)
    • если ваш сайт может работать в режиме разработки (т.е. нет ошибок в журнале), просто загрузите его и войдите в систему вручную
    • Если нет, введите debugger в качестве первой строки в вашем sessions_controller. Затем проверьте params и убедитесь, что пароль правильный и в params[:user][:password].

      Если вы не перекрыли sessions_controller устройства Devise, то вы можете найти свой путь для устройства Devise с помощью bundle show devise. Затем найдите действие create в (devise path)/app/controllers/devise/sessions_controller.rb
  • Измените настройки теста, чтобы создать пользователя через веб-интерфейс, чтобы убедиться, что пароль настроен правильно, затем попробуйте снова запустить тест
1 голос
/ 27 июля 2011

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

Кроме того, обязательно вызовите @ user.skip_confirmation!если вы используете «подтверждаемый» модуль в devise.

...