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

met*_*kat 7 cookies integration-testing ruby-on-rails ruby-on-rails-3

我有基于cookie内容更改的一般应用程序行为,需要测试它.例如,如果用户没有cookie集,表明他们已经接受了网站的法律条款,则需要将他们重定向到T&C页面.

我可以使用功能测试设置cookie

request.cookies["legal_accepted"] = "yes"
Run Code Online (Sandbox Code Playgroud)

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

Sco*_*lin 8

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

get "/", headers: {"HTTP_COOKIE" => "legal_accepted=yes; cookie2=value2;"}
Run Code Online (Sandbox Code Playgroud)


met*_*kat 6

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

get "/", {}, { "HTTP_COOKIE" => "legal_accepted=yes; cookie2=value2; "}
Run Code Online (Sandbox Code Playgroud)


Chr*_*isW 6

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

cookies['foo'] = 'bar'
Run Code Online (Sandbox Code Playgroud)

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

puts cookies['foo']  (returns 'bar')
Run Code Online (Sandbox Code Playgroud)

  • 这适用于 Rails 5 中的 minitest(请参阅“Rack::Test::CookieJar”) (2认同)