是否有可能在轨道集成testing或规范中指定用户代理?

我之前在一个ActionController::IntegrationTest中的rails 2应用程序中执行此操作

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

但是这在Rails 3中似乎不再适用。

我该怎么办?

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

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

以上答案都不适用于我,以下是最终在rspec控制器testing中的工作:

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

我解决了这个问题,在Rails 4.0中,你将能够在集成和functiontesting中指定实际的HTTP Headers,比如“User-Agent”和“Content-Type”。 不再需要将它们指定为CGIvariables。

如果你有兴趣,你可以看看这个变化: https : //github.com/rails/rails/pull/9700

如果您有一系列需要特定用户代理的规格,您可能会发现以下内容有助于干化您的规格:

定义这个地方(例如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

对于我自己,在rspec3中的一个控制器testing中,我使用了

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

在提出请求之前

用户代理只是一个http头,所以你应该可以使用这里的方法: http : //guides.rubyonrails.org/testing.html#helpers-available-for-integration-tests

并传入用户代理到标题(我没有testing这个):

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