Функциональный тест Ruby on Rails с аутентификацией Devise

Ищу решение странной проблемы. У меня есть контроллер, которому требуется аутентификация (с драгоценным камнем разработки). Я добавил Devise TestHelpers, но не могу заставить его работать.

require 'test_helper'

class KeysControllerTest < ActionController::TestCase  
   include Devise::TestHelpers  
   fixtures :keys

   def setup
      @user = User.create!(
        :email => '[email protected]',
        :password => 'MyTestingPassword',
        :password_confirmation => 'MyTestingPassword'
      )
      sign_in @user
      @key = keys(:one)
   end

   test "should get index" do
      get :index    
      assert_response :success
      assert_not_nil assigns(:keys)
   end

   test "should get new" do
      get :new
      assert_response :success
   end

   test "should create key" do
      assert_difference('Key.count') do
         post :create, :key => @key.attributes
      end

      assert_redirected_to key_path(assigns(:key))
   end

   test "should destroy key" do
      assert_difference('Key.count', -1) do
         delete :destroy, :id => @key.to_param
      end

      assert_redirected_to keys_path
   end

конец

И я получаю следующий вывод в своем окне «рейк-тест»:

29) Failure:
test_should_create_key(KeysControllerTest) [/test/functional/keys_controller_test.rb:29]:
"Key.count" didn't change by 1.
<3> expected but was
<2>.

 30) Failure:
test_should_destroy_key(KeysControllerTest) [/test/functional/keys_controller_test.rb:37]:
"Key.count" didn't change by -1.
<1> expected but was
<2>.

 31) Failure:
test_should_get_index(KeysControllerTest) [/test/functional/keys_controller_test.rb:19]:
Expected response to be a <:success>, but was <302>

 32) Failure:
test_should_get_new(KeysControllerTest) [/test/functional/keys_controller_test.rb:25]:
Expected response to be a <:success>, but was <302>

Может кто-нибудь сказать мне, почему разработка не аутентифицируется? Я использую точно такую ​​же процедуру для AdminController, и она отлично работает.


person axx    schedule 10.04.2011    source источник


Ответы (3)


Вы используете Devise с подтверждаемым? В этом случае создать недостаточно и нужно подтвердить пользователя с помощью @user.confirm!

Во-вторых, почему вы создаете пользователя в функциональном тесте? Объявите своих пользователей в фикстуре следующим образом (confirmed_at, если вам требуется только подтверждение):

тест/фикстуры/users.yml:

user1: 
id: 1
email: [email protected]
encrypted_password: abcdef1
password_salt:  efvfvffdv
confirmed_at: <%= Time.now %>

и подпишите их в своих функциональных тестах с помощью:

sign_in users(:user1)

Изменить: я только что увидел, что в моем приложении Devise-Testhelpers объявлены в test/test-helpers.rb, и я не знаю, имеет ли это значение, может быть, вы хотите попробовать:

ENV["RAILS_ENV"] = "test"
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'

class ActionController::TestCase
  include Devise::TestHelpers
end

class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
  #
  # Note: You'll currently still have to declare fixtures explicitly in integration tests
  # -- they do not yet inherit this setting
  fixtures :all

  # Add more helper methods to be used by all tests here...
end
person Markus Proske    schedule 10.04.2011
comment
Потрясающий! Да, я использую подтверждаемую настройку. Поскольку изменение его, как вы описали, работает как шарм. :) - person axx; 10.04.2011
comment
Это действительно работает? Я имею в виду, что Devise шифрует пароли перед тем, как поместить их в базу данных, и, насколько мне известно, фикстуры записываются непосредственно в базу данных. Это означает, что расшифровка должна завершиться неудачно (поскольку abcdef1 не будет правильно расшифровывать). - person Justus Romijn; 27.10.2011
comment
Может ли кто-нибудь добавить указатель на правильный ответ для более новых версий Devise? - person Peter Andersson; 30.09.2013
comment
Да, зашифрованный_пароль должен быть установлен с помощью встроенного кода, чтобы фактически обновить столбец зашифрованными данными. См. stackoverflow.com/a/10427785/18706. - person mahemoff; 23.01.2014

Мне потребовалось некоторое время, чтобы понять, но оказалось, что ответ действительно прост.

Дело в том, что в вашем файле фикстур (users.yml) вам нужно убедиться, что пользователь «подтвержден» (при условии, что вы указали «подтверждаемый» в своей модели пользователя). Так, например, поместите это в свой файл users.yml:

user_one:
  confirmed_at: 2015/01/01

Вот и все, не нужно указывать другие поля (электронная почта, зашифрованный пароль и т.д.).

Теперь в тесте вашего контроллера (например, в «настройке» или «до») вы просто кодируете:

sign_in users(:user_one)

И тогда это должно просто работать!

person leo    schedule 21.02.2015

У меня была аналогичная проблема (но с использованием FactoryGirl, а не Fixtures), и я смог решить ее, просто используя FactoryGirl.create(:user), а не FactoryGirl.build(:user).

Очевидно, Devise требует, чтобы пользователь был сохранен в базе данных, чтобы все работало правильно.

person XtraSimplicity    schedule 04.12.2016