интерпретатор в интерпретаторе
стандартная библиотека код модуль позволяет нам, Вы включаете свой собственный read-eval-print цикл в программе или выполняете целый вложенный интерпретатор. Например, (скопировал мой пример от здесь )
$ python
Python 2.5.1 (r251:54863, Jan 17 2008, 19:35:17)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> shared_var = "Set in main console"
>>> import code
>>> ic = code.InteractiveConsole({ 'shared_var': shared_var })
>>> try:
... ic.interact("My custom console banner!")
... except SystemExit, e:
... print "Got SystemExit!"
...
My custom console banner!
>>> shared_var
'Set in main console'
>>> shared_var = "Set in sub-console"
>>> import sys
>>> sys.exit()
Got SystemExit!
>>> shared_var
'Set in main console'
Это чрезвычайно полезно для ситуаций, где Вы хотите принять заданный сценарием вход от пользователя или запросить состояние VM в режиме реального времени.
TurboGears использует это для большого эффекта при наличии WebConsole, от которого можно запросить состояние Вас живое веб-приложение.
Решение для Devise до 3.2.0
Я думаю, это может быть то, что вы ищете:
User.new.send(:password_digest, 'password')
Это работает, когда соль равна нулю.
И, следовательно, в своем приборе вы можете сделать это:
one:
email: 'some@user.com'
encrypted_password: <%= User.new.send(:password_digest, 'password') %>
Решение для версий от 3.2.0 до 3.5.0
At Devise 3.2.0, метод был создан именно для этой цели (обновление @Inkling). Для этих версий шифрованный пароль должен быть определен следующим образом:
encrypted_password: <%= Devise.bcrypt(User, 'password') %>
где User
- класс вашей пользовательской модели.
Обратите внимание, что это применимо, только если вы используете алгоритм шифрования по умолчанию (bcrypt).
Решение для Devise версий 3.5.1 и выше
Как отметил Катаржина : Device.bcrypt устарел в версии 3.5.1. Начиная с этой версии, encrypted_password должен быть определен следующим образом:
encrypted_password: <%= Devise::Encryptor.digest(User, 'password') %>
Я разобрался с проблемой - я неправильно вошел в систему.
Мой тест должен выглядеть следующим образом:
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 и вставить данные в фиксатор, пожалуйста, пишите.
Это работает для меня.
Я ничего не изменил в своем пользовательском приборе, это выглядит так:
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
Еще один совет. Это прекрасно сработало для меня:
И, похоже, это СУХОЕ и хорошее решение.