6

我是猴子修補Capybara :: Session的set_headers方法,分配給Capybara :: RackTest :: Browser的選項屬性(我已經從attr_reader更改爲attr_accessor)。在RSpec請求規格中使用Capybara時,設置自定義請求標頭的最佳方式是什麼?

補丁:

class Capybara::RackTest::Browser 
    attr_accessor :options 
end 

class Capybara::Session 
    def set_headers(headers) 
    if driver.browser.respond_to?(:options=) #because we've monkey patched it above 
     options = driver.browser.options 
     if options.nil? || options[:headers].nil? 
     options ||= {} 
     options[:headers] = headers 
     else 
     options[:headers].merge!(headers) 
     end 
    else 
     raise Capybara::NotSupportedByDriverError 
    end 
    end 
end 

在我的要求規範,我這樣做:

page.set_headers("REMOTE_ADDR" => "1.2.3.4") 
visit root_path 

這工作,但我不知道是否有更好的方法,它似乎有點矯枉過正,可以根據請求設置自定義remote_ip/remote_addr。有什麼想法嗎?

回答

1

如果你想在標題上的所有請求全局設置,您可以使用類似:

Capybara.register_driver :custom_headers_driver do |app| 
    Capybara::RackTest::Driver.new(app, :headers => {'HTTP_FOO' => 'foobar'}) 
end 

見水豚1.1.2和水豚的問題#320,Setting up HTTP headersrack_test_driver_spec.rb

1

您是否需要在rspec中使用capybara將自定義頭添加到一個特定請求中?我在驗收測試中使用了這個。對我來說,使用特定標題數據的get方法是最好的方法。您可以評估響應頁面上的特定元素。看到我的例子如下:

get user_registration_path, { :invite => invite_token }, { 'X_GEOIP_COUNTRY_CODE' => 'US' } 
expect(assigns(:ip_country)).to eq('US') 
response.body.should have_selector("input#currency_usd[checked='checked']") 

我希望它有幫助。

相關問題