Search code examples
pythontestingflasknosetestswerkzeug

Get IP Address when testing flask application through nosetests


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.


Solution

  • 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()