Ошибка stringify_keys после добавления переменных сеанса в функциональных тестах

Я нахожусь в процессе обновления до Rails 3.1.0 с 3.0.10 и использую Devise для аутентификации.

У меня есть ряд функциональных тестов, которые требуют от меня установки одной переменной сеанса. Вещи в духе:

test "new clears current_lesson_id from session" do
  get :new, nil, {'current_lesson_id' => '234234'}
  assert_response :success
  assert_nil session[:current_lesson_id]
end

Это не удалось, так как моя информация о сеансе стирала данные сеанса аутентификации устройства, поэтому моим предыдущим решением было слияние с сеансом по умолчанию:

test "new clears current_lesson_id from session" do
  get :new, nil, authenticated_sesion_with({'current_lesson_id' => '234234'})
  assert_response :success
  assert_nil session[:current_lesson_id]
end

def authenticated_session_with(hash)
  session.merge(hash)
end

Все это отлично работало с rails 3.0.10 (с warden 1.0.4 и devise 1.4.2), но уже не с rails 3.1.0 (и warden 1.0.5, devise 1.4.4). Теперь я получаю следующую ошибку:

NoMethodError: private method `stringify_keys' called for <ActionController::TestSession:0x000001060db590>

Я так понимаю, это связано с тем, что объект "session" является экземпляром ActionController::TestSession, а в rails 3.1.0 есть куча переменных экземпляра, которые не могут и не должны быть "строковыми".

Как мне правильно получить доступ к информации о пользователе devise (желательно динамически), чтобы я мог добавить «current_lesson_id» и т. д.?

Большое спасибо,


person doublea    schedule 08.09.2011    source источник
comment
session['current_lesson_id'] = 234234 get :new ну извини.   -  person doublea    schedule 09.09.2011


Ответы (2)


попробуйте это, чтобы исправить вашу ошибку в Rails 3.1

  sign_in user
  hashy = session['warden.user.user.key'][2]
  get :action, nil, {"warden.user.user.key"=>["User", [user.id],hashy]}, nil

Работал на меня. Кажется, ему не нравится новый способ, которым Rails обрабатывает TestSessions.

person mikeborgh    schedule 19.10.2011

Я думаю, вам лучше сделать:

def valid_session
    my_session_values = {:some_key => :some_value}
    session.to_hash.merge my_session_values
end
person rafaelkin    schedule 21.08.2012