views:

417

answers:

4

For test purposes I want to change the return value of request.remote_ip. While being on my development machine it returns always 127.0.0.1 as it should but I would like to give myself different fake IPs to test the correct behavior of my app without deploying it to an live server first!

Thank you.

+2  A: 

You can modify the request object using:

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

request.remote_ip now returns 1.2.3.4

Veger
this makes the request with the new IP only available for the current scope. I need a way to change it for the whole application.
Wolax
You are right, I added a new answer to enable it for your whole application
Veger
A: 

You can cheat a bit by making a mutator for the remote_ip value in the test environment which is normally not defined.

For instance, alter the class inside of test/test_helper.rb with the following:

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

Then, during your testing you can reassign as required:

def test_something
  @request.remote_ip = '1.2.3.4'
end

This can be done either in the individual test, or within your setup routine, wherever is appropriate.

I have had to use this before when writing functional tests that verify IP banning, geolocation, etc.

tadman
this goes more in the direction I want to go in. But I want to make this available for development environment/manuel testing. Is there some place I could put @env['REMOTE_ADDR'] = "1.2.3.4"?
Wolax
+1  A: 

If you want this functionality in your whole application, it might be better/easier to override the remote_ip method in your app/helpers/application_helper.rb:

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

And the 1.2.3.4 address is available everywhere

Veger
Perfect! That does the trick. Thank's a lot.
Wolax
A: 

What I ended up doing now was to put this code in the end of the config/environments/development.rb file to make sure it's only executed while in development

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

So this sets remote_ip to 1.2.3.4 when the server starts. Everytime you change the value you have to restart the server!

Wolax