如何在Rails中为集成测试设置cookie?

时间:2012-12-21 23:33:39

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

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

我可以使用

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

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

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:5)

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

cookies['foo'] = 'bar'

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

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

答案 2 :(得分:3)

对于Rails 5集成测试,metkat的答案应该略有改变:

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

答案 3 :(得分:0)

如果你想使用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")