My application depends on request.remote_addr
which is None
when i run tests through nosetests which uses app.test_client().post('/users/login', ....)
.
How can I emulate an IP (127.0.0.1 works fine) when I run tests?
I've tried setting environment variables, sent in headers with the post() method and I've digged through nosetests, werkzeugs and flasks documentation but nothing I've tried has worked.
You can set options for the underlying Werkzeug environment using environ_base:
from flask import Flask, request
import unittest
app = Flask(__name__)
app.debug = True
app.testing = True
@app.route('/')
def index():
return str(request.remote_addr)
class TestApp(unittest.TestCase):
def test_remote_addr(self):
c = app.test_client()
resp = c.get('/', environ_base={'REMOTE_ADDR': '127.0.0.1'})
self.assertEqual('127.0.0.1', resp.data)
if __name__ == '__main__':
unittest.main()
A friend gave me this solution, which works across all requests:
class myProxyHack(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
environ['REMOTE_ADDR'] = environ.get('REMOTE_ADDR', '127.0.0.1')
return self.app(environ, start_response)
app.wsgi_app = myProxyHack(app.wsgi_app)
app.test_client().post(...)