Функциональное тестирование с Rails и Devise. Что положить в мои светильники? - PullRequest
26 голосов
/ 02 января 2011

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

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

  1. Войти
  2. Более 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: jez@example.com
 age: 36

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

Ответы [ 4 ]

66 голосов
/ 03 мая 2012

Решение для Devise pre 3.2.0

Я думаю, это то, что вы ищете:

User.new.send(:password_digest, 'password')

Это работает, когда соль равна нулю.

И, следовательно, в вашем приборе вы можете сделать это:

one:
  email: 'some@user.com'
  encrypted_password: <%= User.new.send(:password_digest, 'password') %>

Решение для версий Devise 3.2.0 до 3.5.0

В Devise 3.2.0 для этой цели был создан метод (@Inkling update).Для этих версий шифрованный пароль должен быть определен следующим образом:

encrypted_password: <%= Devise.bcrypt(User, 'password') %>

, где User - это класс вашей пользовательской модели.

Обратите внимание, что это применимо, только если выиспользуя алгоритм шифрования по умолчанию (bcrypt).


Решение для Devise версий 3.5.1 и выше

As Katarzyna указал: Device.bcrypt устарел в версии 3.5.1.Начиная с этой версии, encrypted_password должен быть определен следующим образом:

encrypted_password: <%= Devise::Encryptor.digest(User, 'password') %>
7 голосов
/ 02 января 2011

Я разобрался с проблемой - я неправильно вошел в систему.

Мой тест должен прочитать:

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: jez@example.com
 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 и вставить данные в фиксатор, пожалуйста, напишите.

2 голосов
/ 11 декабря 2014

Еще один совет.Это прекрасно сработало для меня:

http://brandonhilkert.com/blog/managing-login-passwords-for-capybara-with-minitest-and-rails-fixtures/

И, похоже, это СУХОЕ и хорошее решение.

1 голос
/ 27 мая 2015

Это работает для меня.

Я ничего не изменил в своем пользовательском приборе, это так:

one:
  id: 1
  name: MyString
  email: mystring@test.com
  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
...