2010-01-08 8 views
9

Zu Testzwecken möchte ich den Rückgabewert von request.remote_ip ändern. Während ich auf meinem Entwicklungscomputer bin, gibt es immer 127.0.0.1, wie es sollte, aber ich würde mir gerne verschiedene gefälschte IPs geben, um das korrekte Verhalten meiner App zu testen, ohne sie zuerst auf einen Live-Server zu verteilen!Wert von request.remote_ip in Ruby on Rails ändern

Vielen Dank.

Antwort

13

Wenn Sie diese Funktionalität in der gesamten Anwendung wollen, könnte es besser/einfacher sein, die remote_ip Methode außer Kraft zu setzen in Ihre app/helpers/application_helper.rb:

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

Und die 1.2.3.4-Adresse ist überall

+0

Perfekt! Das macht den Trick. Danke vielmals. – Matt

4

Sie können das Request-Objekt ändern mit:

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

request.remote_ip jetzt kehrt 1.2.3.4

+0

dies die Anforderung mit der neuen IP für den Strom nur zur Verfügung stellt Umfang. Ich brauche einen Weg, um es für die ganze Anwendung zu ändern. – Matt

+0

Sie haben Recht, ich habe eine neue Antwort hinzugefügt, um es für Ihre gesamte Anwendung zu aktivieren – Veger

5

Sie ein bisschen schummeln kann in der Testumgebung einen Mutator für den remote_ip Wert, indem sie die in der Regel nicht der Fall ist definiert.

Zum Beispiel ändern, um die Klasse in dem Test/test_helper.rb mit dem folgenden:

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

Dann während der Prüfung Sie können je nach Bedarf neu zuweisen:

def test_something 
    @request.remote_ip = '1.2.3.4' 
end 

Dies kann getan werden, Entweder im individuellen Test oder innerhalb Ihrer Setup-Routine, wo immer es angebracht ist. diese verwenden, bevor beim Schreiben Funktionstests

Ich habe die IP-Verbot, Geolocation überprüfen usw.

+0

das geht mehr in die Richtung, in die ich gehen möchte. Aber ich möchte dies für die Entwicklungsumgebung/manuelle Tests zur Verfügung stellen. Gibt es einen Ort, wo ich @env ['REMOTE_ADDR'] = "1.2.3.4" setzen könnte? – Matt

3

verfügbar Was ich schließlich am Ende der config/environments/development.rb Datei tun nun war diesen Code zu setzen, um sicherzustellen, es ist wird nur während der Entwicklung ausgeführt

Das setzt remote_ip auf 1.2.3.4 wenn der Server startet. Jedes Mal, wenn Sie den Wert ändern, müssen Sie den Server neu starten!

0

Diese Antwort ist nur für rails3 funktioniert (ich diese Antwort gefunden, wenn eine ähnliche Frage für Schienen 3 zu beantworten versuchen),

Also hier falls ich es schreiben, wenn jemand das Gleiche versucht, in zu tun Rails3 env

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

HTH

2

Schienen 4.0.1 rc. Nach Stunde dieser einfache Lösung gefunden entsprechend beim Graben :) Tests

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

Für die Integration zu kodieren, das funktioniert mit Schienen 5:

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