Функциональный тест Ruby on Rails с аутентификацией Devise
Я ищу решение для странной проблемы. У меня есть контроллер, который нуждается в аутентификации (с жемчужиной разработки). Я добавил 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
конец
И я получаю следующий вывод в моем окне "тест рейка":
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 ответа
Используете ли вы Devise с подтвержденным? В этом случае создать недостаточно, и вам нужно подтвердить пользователя с @user.confirm!
Во-вторых, почему вы создаете пользователя в функциональном тесте? Объявите своих пользователей в этом приспособлении следующим образом (Verified_at, если вам требуется только подтверждение):
тест / приборы /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
Это заняло у меня некоторое время, чтобы выяснить, но оказалось, что ответ действительно прост.
Дело в том, что в вашем файле фикстур (users.yml) вам нужно убедиться, что пользователь "подтвержден" (при условии, что вы указали "подтверждаемый" в вашей модели User). Так, например, поместите это в your users.yml:
user_one: Подтверждено: 2015/01/01
Вот и все, не нужно указывать другие поля (адрес электронной почты, зашифрованный пароль и т. Д.).
Теперь в тесте вашего контроллера (например, в "setup" или в "before") вы просто пишете:
вход пользователя (:user_one)
И тогда это должно просто работать!
У меня была похожая проблема (но с использованием FactoryGirl, а не Fixtures), и я смог решить ее, просто используя FactoryGirl.create(:user)
скорее, чем FactoryGirl.build(:user)
,
Очевидно, Devise требует, чтобы пользователь был сохранен в базе данных, чтобы все работало правильно.