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

时间:2011-09-12 21:57:07

标签: ruby-on-rails session integration-testing

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

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

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

2 个答案:

答案 0 :(得分:5)

据我所知,你不能。集成测试中的会话值 (在轨道3.2.2中)是一份副本。 (Rails众神:如果我是的话,请纠正我 错误。)您可以设置值,但不会影响下一个get / post 因为它是真实会话的本地副本。非常适合断言测试, 在集成测试期间保持会议状态不太好。

我有一个测试控制器来支持Evergreen的JavaScript测试。

我的解决方案是向我的测试控制器和可用路线添加方法 当我不在制作中时,它允许我设置会话值。

基本上我的app_test #set_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

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

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

不如“session [:user_id] ='我的名字是Mudd'”那么漂亮,但它确实有效。 我的下一篇文章/获取将会看到会话[:user_id]设置为所需的值。

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

答案 1 :(得分:1)

为什么没有手动交互就不能进行身份验证?它是否使用CAPTCHA?如果是这样,那么存根就会在测试环境中运行。

相关问题