2010-01-08 8 views
9

Para fines de prueba, deseo cambiar el valor de retorno de request.remote_ip. Mientras estoy en mi máquina de desarrollo, siempre devuelve 127.0.0.1 como debería, pero me gustaría darme direcciones IP falsas para probar el comportamiento correcto de mi aplicación sin implementarla primero en un servidor en vivo.Cambiar el valor de request.remote_ip en Ruby on Rails

Gracias.

Respuesta

13

Si desea que esta funcionalidad en toda su aplicación, tal vez sería mejor/más fácil de reemplazar el método de remote_ip su app/helpers/application_helper.rb:

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

Y la dirección 1.2.3.4 está disponible en todas partes

+0

¡Perfecto! Eso hace el truco. Muchas gracias. – Matt

4

Puede modificar el objeto de la petición usando:

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

request.remote_ip ahora vuelve 1.2.3.4

+0

esto hace la solicitud con la nueva IP sólo está disponible para el actual alcance. Necesito una forma de cambiarlo para toda la aplicación. – Matt

+0

Tiene razón, agregué una nueva respuesta para habilitarlo para toda su aplicación – Veger

5

Usted puede engañar un poco al hacer un mutador para el valor remote_ip en el entorno de prueba que normalmente no es definido.

Por ejemplo, alterar la clase interior de prueba/test_helper.rb con lo siguiente:

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

Luego, durante su prueba puede reasignar según sea necesario:

def test_something 
    @request.remote_ip = '1.2.3.4' 
end 

Esto se puede hacer ya sea en la prueba individual o dentro de su rutina de instalación, donde sea apropiado.

he tenido que usar esto antes de la hora de escribir pruebas funcionales que verifican la prohibición de IP, geolocalización, etc.

+0

esto va más en la dirección en la que quiero ingresar. Pero quiero que esté disponible para el entorno de desarrollo/pruebas de manuel. ¿Hay algún lugar donde pueda poner @env ['REMOTE_ADDR'] = "1.2.3.4"? – Matt

3

lo que terminé haciendo ahora era poner este código en el final del archivo config/environments/development.rb para asegurarse de que es solo se ejecutó mientras estaba en desarrollo

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

Esto establece remote_ip en 1.2.3.4 cuando se inicia el servidor. ¡Cada vez que cambie el valor, debe reiniciar el servidor!

0

Esta respuesta sólo se trabaja para rails3 (He encontrado esta respuesta cuando se trata de responder a una pregunta similar para los carriles 3),

así que voy a publicar aquí en caso de que si alguien está tratando de hacer lo mismo en Rails3 env

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

HTH

2

rieles 4.0.1 RC. Después de horas de búsqueda encontrado esta sencilla solución durante la excavación para codificar :)

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

Para las pruebas de integración, esto funciona con los carriles 5:

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