在请求规范中传递cookies

14

我正在尝试使用rspec 2和rails 3在进行GET请求时传递cookie。

到目前为止,我已经尝试了以下几种方法。

get "/", {}, {"Cookie" => "uuid=10"} # cookies[:uuid] is nil
request.cookies[:uuid] = 10 # request is nil
@request.env["Cookie"] = "uuid=10" # @request is nil
helper.request.cookies[:uuid] # helper is not defined
cookies[:uuid] = 10 # cookies[:uuid] is nil
controller.cookies[:uuid] = 10 # cookies is nil

这可行吗?

6个回答

9
在 RSpec 请求测试中对我有用的是显式传递 HTTP Cookie 头部:
  before do
    get "/api/books", headers: { Cookie: "auth=secret" }
  end

这个答案可以通过提供一个更具体的例子来改进。 - OuttaSpaceTime

8
根据这个答案,你可以在请求规范中使用cookies方法:
before { cookies['foo'] = 'bar' }

我尝试了@phoet的解决方案,涉及到ActionDispatch :: Request.any_instance.stubs,但在RSpec 3.4中它会抛出一个错误,以及一个看起来不相关的弃用消息。

5

一开始我对你的做法有些困惑,但其实很简单。在Rails的ActionDispatch::IntegrationTest内(RSpec中是:request spec),你可以访问cookies变量。

它的作用如下:

# set up your cookie
cookies["fruits"] = ["apple", "pear"]

# hit your endpoint
get fruits_path, {}, {}

# this works!
expect(cookies["fruits"]).to eq(["apple", "pear"])

4

4
我曾经遇到过类似的问题,但始终没有找到合适的解决方案。
根据rspec-rails文档,应该是可以实现的:
# spec
request.cookies['foo'] = 'bar'
get :some_action
response.cookies['foo'].should eq('modified bar')

在我的规范中,在执行get请求之前,request始终为nil。 我现在正在模拟cookies:
before { ActionDispatch::Request.any_instance.stubs(cookies: {locale: :en}) }

这位用户遇到了类似的问题。

这个人也有同样的问题。


2
你链接的文档是针对控制器规范而非请求规范,这就是为什么 request 返回 nil 的原因。同时,我也在尝试找出如何在 RSpec 3.4 中实现此功能。 - Chris Peters

0

我收到了你的问题。在我的情况下,我需要从控制器中的cookie获取_sid,代码如下:request.cookies['_sid']

我通过以下方式解决了这个问题:

before do
  @request.cookies['_sid'] = sid
  get :show, id: job_id
end

这对我有效。

所以在你的情况下,你可以试一试。

before do
  @request.cookies[:uuid]
  get "/", {}
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接