Функциональный тест Ruby on Rails с аутентификацией Devise - PullRequest
9 голосов
/ 10 апреля 2011

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

require 'test_helper'

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

   def setup
      @user = User.create!(
        :email => 'testuser@demomailtest.com',
        :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

конец

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

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, и она отлично работает.

Ответы [ 3 ]

23 голосов
/ 10 апреля 2011

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

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

test / fixtures / users.yml:

user1: 
id: 1
email: user1@test.eu
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
1 голос
/ 21 февраля 2015

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

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

user_one:
  confirmed_at: 2015/01/01

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

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

sign_in users(:user_one)

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

0 голосов
/ 05 декабря 2016

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...