Как установить HTTP_USER_AGENT в rspec-тестирование

Возможный дубликат:
Можно ли указать пользовательский агент в тесте интеграции интеграции или спецификации?

Я тестирую запрос в своем приложении rails с помощью rspec. Мне нужно установить пользовательский агент перед запросом.

Это не работает:

  describe "GET /articles feed for feedburner" do
it "displays article feed if useragent is feedburner" do
  # Run the generator again with the --webrat flag if you want to use webrat methods/matchers
  @articles=[]
  5.times do
    @articles << Factory(:article, :status=>1, :created_at=>3.days.ago)
  end
  request.env['HTTP_USER_AGENT'] = 'feedburner'
  get "/news.xml" 
  response.should be_success
  response.content_type.should eq("application/xml")
  response.should include("item[title='#{@articles.first.title}']")
end

конец

Как я могу правильно указать агент пользователя?

Ответ 1

Попробуйте использовать это в своем тесте:

request.stub!(:user_agent).and_return('FeedBurner/1.0')

или для нового RSpec:

allow(request).to receive(:user_agent).and_return("FeedBurner/1.0")

Замените FeedBurner/1.0 на пользовательский агент, который вы хотите использовать. Я не знаю, будет ли этот точный код работать, но что-то вроде этого.

Ответ 2

Это то, что я делаю в тесте интеграции - обратите внимание на последний хеш, который устанавливает REMOTE_ADDR (без HTTP_). То есть вам не нужно устанавливать HTTP-заголовок перед запросом, вы можете сделать это как часть запроса.

# Rails integration tests don't have access to the request object (so we can't mock it), hence this hack
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

Ответ 3

Определите это где-нибудь (например, spec_helper.rb):

module DefaultUserAgent

  def post(uri, params = {}, session = {})
    super uri, params, {'HTTP_USER_AGENT' => MY_USER_AGENT}.merge(session)
  end

  def get(uri, params = {}, session = {})
    super uri, params, {'HTTP_USER_AGENT' => MY_USER_AGENT}.merge(session)
  end

end

Тогда просто include DefaultUserAgent, когда вам это нужно.