Можно ли указать агент пользователя в тесте интеграции или спецификации?

Я делал это раньше в приложении rails 2 в ActionController::IntegrationTest с

get '/', {}, {:user_agent => "Googlebot"}

но в Rails 3 это больше не работает.

Что мне делать?

Ответ 1

Если вы используете request.user_agent в своем приложении, вы можете написать следующий код:

get '/', {}, { "HTTP_USER_AGENT" => "Googlebot" }

Ответ 2

Ни один из вышеперечисленных ответов не работал у меня, вот что, наконец, работало в тесте контроллера rspec:

@request.user_agent = "a MobileDevice/User-Agent"
post :endpoint, param: 2354

Ответ 3

Я исправил это поведение, и с Rails 4.0 вы сможете указать фактические заголовки HTTP, такие как "User-Agent" и "Content-Type" в интеграционных и функциональных тестах. Больше нет необходимости указывать их как переменные CGI.

Если вас это интересует, вы можете взглянуть на изменение: https://github.com/rails/rails/pull/9700

Ответ 4

Если у вас есть набор спецификаций, для которых все требуются определенные пользовательские агенты, вы можете найти следующие советы для СУШИЛЬНОСТИ ваших спецификаций:

Определите это где-нибудь (например, 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, когда вам это нужно.

Ответ 5

Для себя, в тесте контроллера в rspec3, я использовал

request.env["HTTP_USER_AGENT"] = "Hello"

Перед тем, как сделать запрос

Ответ 6

Я смог заставить его работать на Rails 5.2.1, используя это:

get '/path', headers: { 'HTTP_USER_AGENT' => 'Mozilla/5.0 (blah blah)' }

Я искал здесь подходящих ключевых слов для метода.

Ответ 7

Пользовательский агент - это только HTTP-заголовок, поэтому вы можете использовать следующие методы: http://guides.rubyonrails.org/testing.html#helpers-available-for-integration-tests

И передать пользовательский агент в заголовки (я не тестировал это):

headers = {"User-Agent" => "Googlebot"}
request_via_redirect(:get, '/', {}, headers)