Подтвердить что ты не робот

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

4b9b3361

Ответ 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! если вы используете "подтверждаемый" модуль в разработке.