【问题标题】:How do I set a cookie for an integration test in Rails?如何在 Rails 中为集成测试设置 cookie?
【发布时间】:2012-12-09 12:43:38
【问题描述】:

我的一般应用程序行为会根据 cookie 内容发生变化,需要对其进行测试。例如,如果用户没有设置表明他们已接受网站法律条款的 cookie,则需要将他们重定向到 T&C 页面。

我可以使用

在功能测试中设置 cookie
request.cookies["legal_accepted"] = "yes"

但是,这在集成测试中不起作用 - 没有可使用的请求对象。我一直找不到任何文档说明为什么会这样,还有什么不同,以及处理差异的最佳实践。如何为给定的请求设置 cookie?原因和原因是否记录在任何地方?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 cookies integration-testing


    【解决方案1】:

    我发现这样做的唯一方法是在请求中手动设置 cookie 标头,例如

    get "/", {}, { "HTTP_COOKIE" => "legal_accepted=yes; cookie2=value2; "}
    

    【讨论】:

      【解决方案2】:

      在 Rails 3.2.x(当然是 3.2.16)中,您可以直接在集成测试中分配 cookie:

      cookies['foo'] = 'bar'
      

      您现在可以在您的测试和应用程序中访问 c​​ookie 'foo':

      puts cookies['foo']  (returns 'bar')
      

      【讨论】:

      • 您使用的是什么测试框架?我无法让它工作。
      • 这适用于 Rails 5 中的 minitest(参见 Rack::Test::CookieJar
      【解决方案3】:

      如果你想使用 Poltergeist,有一些方法可以处理我在集成测试中使用的 cookie。

      https://github.com/teampoltergeist/poltergeist#manipulating-cookies

      需要注意的一点是,如果要更新 cookie,则必须先删除 cookie,然后再设置它。

      page.driver.remove_cookie("cookie_name")
      page.driver.set_cookie("cookie_name", "some_value")
      

      【讨论】:

      • 这个问题是关于 Rails 集成测试,而不是基于 Poltergeist 的全栈测试。
      【解决方案4】:

      对于 Rails 5 集成测试,metkat 的答案应该稍微改变一下:

      get "/", headers: {"HTTP_COOKIE" => "legal_accepted=yes; cookie2=value2;"}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-19
        • 1970-01-01
        • 1970-01-01
        • 2012-07-10
        • 1970-01-01
        相关资源
        最近更新 更多