问题 如何在黄瓜+水豚步骤定义中设置HTTP_REFERER?


如何使用capybara为黄瓜步骤定义的请求设置HTTP_REFERER请求标头?

谷歌搜索,我尝试了以下,没有一个工作:

header 'Referer', 'http://example.com/'
ENV['HTTP_REFERER'] = 'http://example.com/'
get '/', {}, { 'HTTP_REFERER' => 'http://example.com/' }
get '/', nil, { 'HTTP_REFERER' => 'http://example.com/' }
request.env['HTTP_REFERER'] = 'http://example.com/' # raises ArgumentError

visit '/'

我在控制器中打印request.env ['HTTP_REFERER'],以证明它没有通过。如果我使用Web浏览器测试控制器,则会正确打印引用程序。

注意实际上是3参数使用get get  将HTTP_REFERER放入控制器观察到的请求环境中,但它似乎以一种我无法弄清楚的方式扰乱请求;所有渲染的都是doctype元素。

我正在使用默认的黄瓜驱动程序,Cucumber :: RackTest :: Driver,黄瓜-1.1.3,黄瓜-strip-1.2.0和capybara-1.1.2。


3690
2017-12-06 14:18


起源



答案:


由于我使用的是Cucumber :: RackTest :: Driver,在撰写本文时,我的解决方案是:

Capybara.current_session.driver.header 'Referer', 'http://example.com'

这个解决方案的灵感来自以下对水豚的未合并拉动请求:

https://github.com/thoughtbot/capybara-webkit/issues/198


14
2017-12-06 14:32





我不太了解黄瓜,但是这个[即调用post而不是访问'some_path']在Rspec中为我工作,所以也许类似的解决方案可能适合你(鉴于它也是一个集成测试):

it 'correctly updates the last_login_ip attribute' do
  post login_path, { :email => user.email, :password => user.password }, { 'REMOTE_ADDR' => 'some_address' }
  user.reload
  user.last_login_ip.should == 'some_address'
end

2
2017-12-06 14:37



谢谢。最终,您使用的是Rack :: Test :: Session#get,它支持设置请求环境变量。所以这也应该在黄瓜步骤中起作用,因为最终,这就是Capybara :: Racktest :: Driver最终委托给的。可悲的是,它不起作用;我将更新我的问题,以包括它失败的原因。 - sheldonh
我会说的 ActionDispatch::Integration::RequestHelpers#post 因为这是一个普通的RSpec示例(规范助手中需要'rspec / rails') - maprihoda
然后,这解释了为什么它在rspec而不是Cucumber中工作。感谢您的反馈。 - sheldonh


答案:


由于我使用的是Cucumber :: RackTest :: Driver,在撰写本文时,我的解决方案是:

Capybara.current_session.driver.header 'Referer', 'http://example.com'

这个解决方案的灵感来自以下对水豚的未合并拉动请求:

https://github.com/thoughtbot/capybara-webkit/issues/198


14
2017-12-06 14:32





我不太了解黄瓜,但是这个[即调用post而不是访问'some_path']在Rspec中为我工作,所以也许类似的解决方案可能适合你(鉴于它也是一个集成测试):

it 'correctly updates the last_login_ip attribute' do
  post login_path, { :email => user.email, :password => user.password }, { 'REMOTE_ADDR' => 'some_address' }
  user.reload
  user.last_login_ip.should == 'some_address'
end

2
2017-12-06 14:37



谢谢。最终,您使用的是Rack :: Test :: Session#get,它支持设置请求环境变量。所以这也应该在黄瓜步骤中起作用,因为最终,这就是Capybara :: Racktest :: Driver最终委托给的。可悲的是,它不起作用;我将更新我的问题,以包括它失败的原因。 - sheldonh
我会说的 ActionDispatch::Integration::RequestHelpers#post 因为这是一个普通的RSpec示例(规范助手中需要'rspec / rails') - maprihoda
然后,这解释了为什么它在rspec而不是Cucumber中工作。感谢您的反馈。 - sheldonh