Функциональное тестирование с помощью Rails и Devise. Что положить в мои светильники?
Привет, я хочу выполнить некоторое функциональное тестирование моего приложения Rails 3, которое использует Devise и CanCan.
В моей модели User у меня возраст пользователей, я хочу проверить, что пользователь может посещать только определенную страницу, если они:
Я видел в документе Devise, что я могу использовать: * sign_in *, и я поместил его в свои тесты и, похоже, работает - тест не является ошибкой, потому что у меня есть:
include Devise::TestHelpers
в моем * test_helper.rb *
Когда я беру это, мой тест делает ошибку, потому что * sign_in * не определен. Таким образом, это не проблема помощника.
Когда я запускаю тест и проверяю, не имеет ли значение span # loggedin в одном случае, тест терпит неудачу, потому что есть 0 вхождений. span # loggedin появляется только * если user_signed_in? *
Что мне нужно, чтобы добавить мои тесты или тесты для создания тестового пользователя, который также является полностью зарегистрированным пользователем (подтвержденным и т.д.)?
Просмотр кода:
<% if user_signed_in? %>
<span id="loggedin">User is signed in</span>
User age is <span id="age"><%= current_user.age.to_s %></span>
<% end %>
Тестовый код:
test "should get index" do
sign_in :one
get :index
assert_response :success
assert_select 'span#loggedin', :count => 1
end
Крепеж:
one:
email: [email protected]
age: 36
Он работает нормально в разработке, когда я вручную вхожу, но я надеюсь автоматизировать все это - точка тестирования действительно!!
Ответы
Ответ 1
Решение для Devise pre 3.2.0
Я думаю, что это может быть то, что вы ищете:
User.new.send(:password_digest, 'password')
Он работает, когда соль равна нулю.
И поэтому в вашем приспособлении вы можете сделать это:
one:
email: '[email protected]'
encrypted_password: <%= User.new.send(:password_digest, 'password') %>
Решение для версий от 3.2.0 до 3.5.0
В Devise 3.2.0 для этой цели был создан метод (обновление @Inkling). Для этих версий encrypted_password должен быть определен следующим образом:
encrypted_password: <%= Devise.bcrypt(User, 'password') %>
где User
- класс вашей пользовательской модели.
Обратите внимание, что это применимо только в том случае, если вы используете алгоритм шифрования по умолчанию (bcrypt).
Решение для разработчиков версии 3.5.1 и выше
Как Katarzyna указал: Device.bcrypt устарел в версии 3.5.1. Из этой версии encrypted_password должно быть определено следующим образом:
encrypted_password: <%= Devise::Encryptor.digest(User, 'password') %>
Ответ 2
Я разобрался с проблемой - я неправильно ввел пользователя в систему.
Мой тест должен выглядеть следующим образом:
test "should get index" do
@user = users(:one)
sign_in @user
get :index
assert_response :success
assert_select 'span#loggedin', :count => 1
end
Это также работает и исключает строку кода:
test "should get index" do
sign_in users(:one)
get :index
assert_response :success
assert_select 'span#loggedin', :count => 1
end
Мое понимание светильников не хватало...
Но вернемся к вопросу - что поставить в светильники:
one:
email: [email protected]
encrypted_password: $2a$10$PoBe1MvkoGJsjMVTEjKqgeBUp.xdfzWoiDjBzQhtLAj16NqIa2fOy
password_salt: $2a$10$PoBe1MvkoGJsjMVTEjKqge
reset_password_token: nil
remember_token: nil
remember_created_at: nil
sign_in_count: 1
current_sign_in_at: 2011-01-02 08:31:23
last_sign_in_at: 2011-01-02 08:31:23
current_sign_in_ip: 127.0.0.1
last_sign_in_ip: 127.0.0.1
confirmation_token: nil
confirmed_at: 2011-01-02 08:31:23
confirmation_sent_at: 2011-01-02 08:30:59
failed_attempts: 0
unlock_token: nil
locked_at: nil
authentication_token: nil
created_at: 2011-01-02 08:30:59
updated_at: 2011-01-02 08:31:23
age: 36
Теперь он работает. Если есть легче создать пользователя в dev и вставить данные в прибор, пожалуйста, напишите.
Ответ 3
Еще один намек. Это отлично поработало для меня:
http://brandonhilkert.com/blog/managing-login-passwords-for-capybara-with-minitest-and-rails-fixtures/
И это кажется сухим и приятным решением.
Ответ 4
Это работает для меня.
Я ничего не менял в своем пользовательском устройстве, он вот так:
one:
id: 1
name: MyString
email: [email protected]
group_id: 2
encrypted_password: <%= Devise.bcrypt(User, 'password') %>
Но я изменил свой test_helper.rb
, и я добавил его в класс ActionController
(это будет работать для всех тестов контроллеров):
class ActionController::TestCase
include Devise::TestHelpers
setup do
sign_in users(:one)
end
end