【问题标题】:How to set session variables in Rails integration tests如何在 Rails 集成测试中设置会话变量
【发布时间】:2011-09-12 21:57:07
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    我有一个测试控制器来支持我通过 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 ] = 'My Name Is Mudd'”那么漂亮,但它确实有效。 我的下一篇文章/get 将看到 session[ :user_id ] 设置为所需的值。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-27
      • 2011-12-30
      • 2012-12-09
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多