非常难以让Devise和Declarative在RSpec测试中发挥出色。
https://github.com/stffn/declarative_authorization/issues/95
stringify_keys error after supplementing session variables in functional tests
这些都解决了我的问题,但都没有一个对我有用的解决方案。
# practices_controller_spec.rb
it "assigns a new practice as @practice as owner" do
get_action(:new, @owner)
assigns(:practice).should be_a_new(Practice)
sign_out @owner
end
def get_action(action,user,*id)
sign_in user
get_with user, action, {:id => id}, session
end
# Spec test yields
Failure/Error: get_with user, action, {:id => id}, session
NoMethodError:
private method `stringify_keys' called for #<ActionController::TestSession:0x00000100d8a170>
Session looks like this: {"warden.user.user.key"=>["User", [1840], "$2a$04$2Rq4bHGp.tlIgKHE4PlRle"]}
有任何解决此错误的建议吗?
非常感谢任何帮助。谢谢!
更新
我这样做是为了工作:
def get_action(action,user,*id)
sign_in user
hashy = session['warden.user.user.key'][2]
get_with user, action, {:id => id}, {"warden.user.user.key"=>["User", [user.id],hashy]}, nil
端
答案 0 :(得分:0)
您的更新确实帮我解决了同样的问题。如果我可以稍微扩展你的解决方案,希望这对于(可能现在很少)人们将Rails 3.0升级到3.1并使用设计和声明授权宝石有帮助。
我正在使用Test :: Unit而不是RSpec,但我认为这可以很容易地集成。 我将以下内容添加到ActiveSupport :: TestCase(或者您的测试用例类继承自RSpec)。这样做可以保证其他会话密钥/值对也传递给请求。
class ActiveSupport::TestCase
include Authorization::TestHelper # provides the declarative authorization get_with method
def session_hash(user)
temp_session = session.dup
temp_session.delete("warden.user.user.key")
{"warden.user.user.key"=>["User", [user.id],session['warden.user.user.key'][2]]}.merge(temp_session)
end
end
在你的方法中,get_with请求然后使用session_hash(用户)而不是session。在Test :: Unit中,最后的nil不是必需的
def get_action(action,user,*id)
sign_in user
get_with user, action, {:id => id}, session_hash(user)
end
似乎声明性授权不喜欢Rails 3.1中的ActionController :: TestSession