是否可以在rails集成测试或规范中指定用户代理?

时间:2010-12-08 03:44:51

标签: ruby-on-rails integration-testing

之前我在ActionController::IntegrationTest中使用

的rails 2应用中执行此操作
get '/', {}, {:user_agent => "Googlebot"}

但这似乎在Rails 3中不再起作用。

我该怎么办?

7 个答案:

答案 0 :(得分:43)

如果在应用程序中使用request.user_agent,则可以编写以下代码:

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

答案 1 :(得分:15)

上述答案都不适用于我,以下是最终在rspec控制器测试中起作用的内容:

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

答案 2 :(得分:7)

我修复了这种行为,使用Rails 4.0,您将能够在集成和功能测试中指定实际的HTTP标头,如“User-Agent”和“Content-Type”。不再需要将它们指定为CGI变量。

如果您有兴趣,可以查看更改:https://github.com/rails/rails/pull/9700

答案 3 :(得分: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即可。

答案 4 :(得分:3)

对于我自己来说,在rspec3的控制器测试中,我使用了

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

在提出请求之前

答案 5 :(得分:2)

我能够使用以下方法在Rails 5.2.1上工作:

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

我在here中寻找了该方法可接受的关键字。

答案 6 :(得分:-1)

用户代理只是一个http标头,因此您应该可以使用此处的方法:http://guides.rubyonrails.org/testing.html#helpers-available-for-integration-tests

并将用户代理传递给标题(我没有对此进行测试):

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