如何在Rails集成测试中设置会话变量

jba*_*sko 10 session integration-testing ruby-on-rails

在Rails集成测试中,如何设置会话变量(在我的情况下为:user_id)?

显然,它不是一个完整的集成测试,但鉴于在我的应用程序中用户身份验证不能在没有手动用户交互的情况下发生,我可以以某种方式解决并手动设置会话变量吗?

尝试了以下内容:"session"在该范围内不可用,open_session返回一个我没有找到更新方法的会话.

ecl*_*923 6

据我所知,你做不到.集成测试中的会话值(在rails 3.2.2中)是一个副本.(Rails gods:如果我错了,请纠正我.)你可以设置值,但它不会影响下一个get/post,因为它是真实会话的本地副本.非常适合断言测试,对于在集成测试期间保持会话状态不太好.

我有一个测试控制器,通过Evergreen支持我的JavaScript测试.

我的解决方案是向我的测试控制器添加一个方法,并在我不在生产时提供一个可用的路由,这允许我设置会话值.

基本上我的app_test #set_session方法会屏蔽前缀的参数名称,如果找到前缀,则设置前缀剥离参数名称的session值.就像是:

    params.each() do |key, value|
            next if ( key !~ /^set_session_/)
            session[ key.slice( ("set_session_".size())..-1).to_sym ] = value
    end
    # don't forget to render something/anything
Run Code Online (Sandbox Code Playgroud)

因此,要在集成测试期间设置会话变量,我有一小段代码,如:

    prefix = "set_session_"
    post( "/set_session.html", { (prefix + "user_id") => "My Name Is Mudd" } )
Run Code Online (Sandbox Code Playgroud)

不像"session [:user_id] ='My Name Is Mudd'"那么漂亮,但它确实有效.我的下一篇文章/获取将看到会话[:user_id]设置为所需的值.

这很容易扩展为传递整数,符号等,当然,可以一次设置多个会话键/值对.不漂亮,但不坏.


And*_*ite 1

为什么没有手动交互就无法进行身份验证?它使用验证码吗?如果是这样,请将该部分存根以在测试环境中运行。