Подтвердить что ты не робот

Функциональное тестирование с помощью Rails и Devise. Что положить в мои светильники?

Привет, я хочу выполнить некоторое функциональное тестирование моего приложения Rails 3, которое использует Devise и CanCan.

В моей модели User у меня возраст пользователей, я хочу проверить, что пользователь может посещать только определенную страницу, если они:

  • Записан
  • Более 35

Я видел в документе 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

Он работает нормально в разработке, когда я вручную вхожу, но я надеюсь автоматизировать все это - точка тестирования действительно!!

4b9b3361

Ответ 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 и вставить данные в прибор, пожалуйста, напишите.

Ответ 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