在功能测试中补充会话变量后出现stringify_keys错误

时间:2011-09-08 16:28:32

标签: devise ruby-on-rails-3.1 functional-testing

我正在从3.0.10升级到Rails 3.1.0,我正在使用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,设计1.4.4)。现在我收到以下错误:

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

我收集这是因为'session'对象是ActionController :: TestSession的一个实例,而在rails 3.1.0中有一堆实例变量不能也不应该被“字符串化”。

我应该如何正确访问设计用户信息(最好是动态的),以便我可以添加'current_lesson_id'等?

非常感谢,

2 个答案:

答案 0 :(得分:0)

尝试这个来修复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的新方式。

答案 1 :(得分:0)

我认为你最好这样做:

def valid_session
    my_session_values = {:some_key => :some_value}
    session.to_hash.merge my_session_values
end