2010-01-08 9 views
9

À des fins de test, je souhaite modifier la valeur de retour de request.remote_ip. Tout en étant sur ma machine de développement, il retourne toujours 127.0.0.1 comme il se doit mais je voudrais me donner différentes fausses adresses IP pour tester le bon comportement de mon application sans la déployer d'abord sur un serveur live!Modifier la valeur de request.remote_ip dans Ruby on Rails

Merci.

Répondre

13

Si vous souhaitez activer cette fonctionnalité dans votre application tout, il pourrait être préférable/plus facile de remplacer la méthode remote_ip dans votre app/helpers/application_helper.rb:

class ActionDispatch::Request #rails 2: ActionController::Request 
    def remote_ip 
    '1.2.3.4' 
    end 
end 

Et l'adresse 1.2.3.4 est disponible partout

+0

Parfait! Cela fait l'affaire. Merci beaucoup. – Matt

4

Vous pouvez modifier l'objet de requête en utilisant:

request = ActionController::Request.new('REMOTE_ADDR' => '1.2.3.4') 

request.remote_ip retourne maintenant 1.2.3.4

+0

cela fait la demande avec la nouvelle IP uniquement disponible pour le courant portée. J'ai besoin d'un moyen de le changer pour l'ensemble de l'application. – Matt

+0

Vous avez raison, j'ai ajouté une nouvelle réponse pour l'activer pour l'ensemble de votre application – Veger

5

Vous pouvez tricher un peu en faisant un mutator pour la valeur remote_ip dans l'environnement de test qui est normalement pas défini.

Par exemple, modifier la classe à l'intérieur de test/test_helper.rb avec les éléments suivants:

class ActionController::TestRequest 
    def remote_ip=(value) 
    @env['REMOTE_ADDR'] = value.to_s 
    end 
end 

Puis, au cours de votre test, vous pouvez réassigner au besoin:

def test_something 
    @request.remote_ip = '1.2.3.4' 
end 

Cela peut être fait soit dans le test individuel, soit dans votre routine d'installation, partout où cela est approprié.

J'ai dû utiliser avant lors de l'écriture des tests fonctionnels qui permettent de vérifier IP interdiction, la géolocalisation, etc.

+0

cela va plus dans le sens où je veux aller. Mais je veux que ce soit disponible pour l'environnement de développement/test manuel. Y a-t-il un endroit où je pourrais mettre @env ['REMOTE_ADDR'] = "1.2.3.4"? – Matt

3

ce que je fini par faire maintenant était de mettre ce code à la fin du fichier config/environments/development.rb pour vous assurer qu'il est uniquement exécuté en cours de développement

# fake IP for manuel testing 
class ActionController::Request 
    def remote_ip 
    "1.2.3.4" 
    end 
end 

Cela définit donc remote_ip sur 1.2.3.4 au démarrage du serveur. Chaque fois que vous changez la valeur, vous devez redémarrer le serveur!

0

Cette réponse est ne fonctionne que pour rails3 (j'ai trouvé cette réponse en essayant de répondre à une question similaire pour les rails 3),

Je vais donc poster ici au cas où si quelqu'un essaie de faire la même chose en Rails3 env

class ActionDispatch::Request 
    def remote_ip 
    '1.2.3.4' 
    end 
end 

HTH

2

rails 4.0.1 rc. Après l'heure de la recherche a trouvé cette solution simple, tout en creusant au code :)

get '/', {}, { 'REMOTE_ADDR' => '1.2.3.4' } 
1

Pour les tests d'intégration, cela fonctionne avec les rails 5:

get "/path", params: { }, headers: { "REMOTE_ADDR" => "1.2.3.4" }