Как входить/выходить пользователей с помощью Devise в тестировании Rails4

Я пытаюсь обеспечить надлежащий доступ пользователей с помощью Devise в Rails 4, и мне трудно зарегистрировать пользователя в наборе тестов.

Самый простой случай:

require 'test_helper'
  include Devise::TestHelpers

class SiteLayoutTest < ActionDispatch::IntegrationTest

  def setup
    @user = users(:test1)
  end

  test "logged in should get index" do
    sign_in @user
    get users_path
    assert_response :success
    assert_select "title", "User Index"
  end
end

До сих пор я не сделал ничего, кроме реализации Devise и контроллера Users с соответствующими действиями.

Я постоянно получаю: NoMethodError: undefined method 'env' for nil:NilClass, ссылаясь конкретно на строку, содержащую sign_in @user, и я могу найти другие случаи, когда люди получают ту же ошибку, но никогда не находят фактического решения проблемы, которую я пытаюсь решить.

Как мне войти в систему с помощью Devise в Rails 4 для целей тестирования? Спасибо.

РЕДАКТИРОВАТЬ:

приспособления/users.yml

test1:
  id: '1'
  email: '[email protected]'
  encrypted_password: <%= Devise::Encryptor.digest(User, "password") %>
  created_at: <%= Time.now - 6.minutes %>
  updated_at: <%= Time.now - 4.minutes %>

РЕШЕНИЕ НА МЕСТЕ:

test "logged in should get index" do
  post user_session_path, 'user[email]' => @user.email, 'user[password]' =>  'password'
  get users_path
  assert_response :success
  assert_select "title", "User Index"
end

person spectre6000    schedule 05.06.2015    source источник
comment
Вы пробовали это, например. @user = User.find(1) в настройках   -  person Amit Sharma    schedule 05.06.2015
comment
:test1 определен в фикстурах. ОП отредактировано, чтобы отразить.   -  person spectre6000    schedule 05.06.2015
comment
пожалуйста, добавьте еще один ключ в приспособления, т. е. user: внутри test1:, и поместите адрес электронной почты и пароль в ключ пользователя.   -  person Amit Sharma    schedule 05.06.2015
comment
Вот так (представьте правильное форматирование)? 'test1: пользователь: электронная почта: '[email protected]' зашифрованный_пароль: ‹%= User.new.send(:password_digest, 'пароль') %›'   -  person spectre6000    schedule 05.06.2015
comment
правильно, попробуйте один раз, если не получится, проверьте форму входа и посмотрите там структуру параметров   -  person Amit Sharma    schedule 05.06.2015
comment
При этом мне нужно было добавить/добавить значения для созданного/обновленного в. Готово. Хотя такая же ошибка. NoMethodError: undefined method env' для нуля: NilClass'   -  person spectre6000    schedule 05.06.2015


Ответы (1)


Это из их документов:

«Не используйте Devise::TestHelpers в интеграционных тестах».

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

require 'test_helper'

 class UserFlowsTest < ActionDispatch::IntegrationTest
   test "signed in user is redirected to root_path" do
     get user_session_path
     assert_equal 200, status
     @david = User.create(email: "[email protected]", password: Devise::Encryptor.digest(User, "helloworld"))
     post user_session_path, 'user[email]' => @david.email, 'user[password]' =>  @david.password
     follow_redirect!
     assert_equal 200, status
     assert_equal "/", path
   end

   test "user is redirected to sign in page when visiting home page" do
     get "/"
     assert_equal 302, status
     follow_redirect!
     assert_equal "/users/sign_in", path
     assert_equal 200, status
   end
 end

РЕДАКТИРОВАТЬ: На всякий случай это будет полезно в будущем. Вы можете использовать Warden Test Helpers для интеграционных тестов, но способ, описанный выше, является лучшим тестом. Это рабочий пример:

require 'test_helper'
include Warden::Test::Helpers
class UserFlowsTest < ActionDispatch::IntegrationTest
  test "user can see home page after login" do
    @david = User.create(email: "[email protected]", password: Devise::Encryptor.digest(User, "helloworld"))
    login_as(@david)
    get "/"
    assert_equal 200, status # User gets root_path because he loged in
    assert_equal "/", path
    logout
    get "/"
    assert_equal 302, status # User is redirected because he loged out
    Warden.test_reset! #reset Warden after each example
  end
end
person Luis Menjivar    schedule 05.06.2015
comment
Я читал о том, что помощник не должен включаться в интеграционные тесты, но я достаточно долго копался и искал, и он вернулся обратно. post user_session_path, 'user[email]' => @user.email, 'user[password]' => @user.password ‹= Это был ключ! Спасибо. - person spectre6000; 05.06.2015