10

我正在尝试使用 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

可能吗?

4

5 回答 5

7

根据这个答案,您可以cookies在请求规范中使用该方法:

before { cookies['foo'] = 'bar' }

我尝试了@phoet 的解决方案ActionDispatch::Request.any_instance.stubs,但它在 RSpec 3.4 中引发错误以及看似无关的弃用消息。

于 2016-06-15T13:47:58.930 回答
3

我有一个类似的问题,我没有找到合适的解决方案。

rspec-rails 文档指出它应该是可能的:

# spec
request.cookies['foo'] = 'bar'
get :some_action
response.cookies['foo'].should eq('modified bar')

在我的规范request中总是nil在执行获取之前。

我现在在嘲笑饼干:

before { ActionDispatch::Request.any_instance.stubs(cookies: {locale: :en}) }

这家伙也有类似的问题。

于 2012-09-04T06:36:11.333 回答
3

在 RSpec 请求测试中对我有用的是显式传递 HTTP Cookie 标头:

  before do
    get "/api/books", headers: { Cookie: "auth=secret" }
  end
于 2018-12-04T11:14:18.777 回答
3

一开始我对你是怎么做的有点困惑,但实际上很容易。在 Rails 的 ActionDispatch::IntegrationTest 内部(或者在 rspec 的情况下是:request规范),您可以访问 cookies 变量。

它是这样工作的:

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

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

# this works!
expect(cookies["fruits"]).to eq(["apple", "pear"])
于 2018-03-09T19:21:05.530 回答
2

spec/requests/some_spec.rb您可以使用Rack::Test::Methods来设置和读取cookies。

describe 'Something' do

  include Rack::Test::Methods

  it 'can set cookies' do
    set_cookie "foo=red"
    post '/some/endpoint', params, headers
    expect(last_request.cookies[:foo]).to eq('red')
  end

end

文档:
http ://www.rubydoc.info/github/brynary/rack-test/Rack/MockSession#set_cookie-instance_method

于 2017-12-06T03:50:51.360 回答