Получить IP-адрес при тестировании фляжного приложения с помощью носовых тестов

Мое приложение зависит от request.remote_addr, который равен None, когда я запускаю тесты через Nosetests, который использует app.test_client().post('/users/login', ....).

Как я могу эмулировать IP-адрес (127.0.0.1 работает нормально) при запуске тестов? Я пробовал устанавливать переменные среды, отправлять заголовки с помощью метода post() и копаться в тестах, документацию по werkzeugs и flasks, но ничего из того, что я пробовал, не сработало.


person moodh    schedule 14.02.2013    source источник
comment
comment
@Styvane: Хм, этот вопрос на месяц старше, как это дубликат?   -  person moodh    schedule 08.12.2016
comment
Возможно, я выбрал не тот вопрос, но -much-newer-and-ha/147651#147651">да можно   -  person styvane    schedule 08.12.2016


Ответы (3)


Вы можете установить параметры базовой среды Werkzeug, используя 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()
person DazWorrall    schedule 14.02.2013
comment
Спасибо, это работает отлично, но добавлять это при каждом вызове было бы утомительно. Друг дал мне решение для исправления, которое меняет каждый звонок. Размещение его как ответ, а также. - person moodh; 14.02.2013
comment
+1 Похоже, это то, как werkzeug намеревался сделать это, и это было именно то, что я искал - person Anthony Sottile; 23.09.2013
comment
Теперь мои тесты проходят в экземплярах, которые должны иметь действительный IP. Спасибо. - person iChux; 04.08.2016

Друг дал мне это решение, которое работает для всех запросов:

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(...)
person moodh    schedule 14.02.2013

Вы также можете передать параметр header параметру test_request_context, если хотите.

Пример:

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_headers(self):
        user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0"
        ip_address = 127.0.0.1
        headers = {
            'Remote_Addr': ip_address,
            'User_Agent': user_agent
        }

        with self.test_request_context(headers=headers):
            # Do something
            pass

Это полезно, когда вам нужно выполнить несколько модульных тестов, используя объект request в других модулях.

См. документацию test_request_context.

person Céline Martinet Sanchez    schedule 22.07.2019