2010-12-08 29 views

Répondre

43

Si vous utilisez request.user_agent dans votre application, vous pouvez écrire le code suivant:

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

Est-ce documenté quelque part? –

+0

Impressionnant - connaissez-vous un moyen de définir ceci pour toutes les demandes faites lors des tests d'intégration? –

+0

Pouvez-vous expliquer pourquoi le fait de passer des symboles ne fonctionne plus? Cela semble être un pas en arrière d'un point de vue syntaxique, et un tracas de migration inutile lors du portage à partir de 2.x. – Matthias

-1

Un agent utilisateur est juste un en-tête http, donc vous devriez être en mesure d'utiliser les méthodes ici: http://guides.rubyonrails.org/testing.html#helpers-available-for-integration-tests

Et passer l'agent utilisateur aux en-têtes (je ne l'ai pas testé cela):

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

C'est ce que je fais. 'request.user_agent' dans mon contrôleur renvoie zéro. Si je fais la même expérience avec l'application en cours, elle renvoie l'agent utilisateur. –

+0

avez-vous essayé request.headers ['User-Agent'] – zsalzbank

+0

ne fonctionne pas - même problème ici avec Accept et Content-Type. – Matthias

2

Si vous avez une collection de spécifications qui exigent tous un utilisateur spécifique agent, vous pouvez trouver les aides suivantes pour sécher vos spécifications:

Définissez cela quelque part (par ex. 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 

Ensuite, il suffit include DefaultUserAgent quand vous en avez besoin.

7

J'ai corrigé ce comportement et avec Rails 4.0, vous pourrez spécifier des en-têtes HTTP réels tels que "User-Agent" et "Content-Type" dans les tests d'intégration et fonctionnels. Il n'est plus nécessaire de les spécifier en tant que variables CGI.

Si vous êtes intéressés, vous pouvez consulter le changement: https://github.com/rails/rails/pull/9700

15

Aucune des réponses ci-dessus a fonctionné pour moi, ce qui suit est ce qui a finalement travaillé dans un test de contrôleur rspec:

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

méthode non définie' user_agent = 'pour nil: NilClass – Eddie

2

pour moi-même, dans un test de contrôleur rspec3, je

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

Avant de faire la demande