2013-02-14 27 views
17

Moja aplikacja zależy od request.remote_addr, która jest None, gdy przeprowadzam testy przez testy nosa, które używają app.test_client().post('/users/login', ....).Uzyskaj adres IP podczas testowania aplikacji kolby przez testy nosem

Jak mogę emulować adres IP (127.0.0.1 działa poprawnie) po uruchomieniu testów? Próbowałem ustawić zmienne środowiskowe, wysłane w nagłówkach za pomocą metody post(), a ja przekopałem dokumentację nosa, dokumentację werkzeugs i kolb, ale nic, co próbowałem, nie zadziałało.

+0

Możliwa duplikat [Setting (szyderczy) żądaj nagłówków dla testu jednostki aplikacji Flask] (http://stackoverflow.com/questions/15278285/setting-mocking-request-headers-for-flask-app-unit-test) – styvane

+0

@Styvane: Uhm, to pytanie jest miesiąc starszy, jak to duplikat? – moodh

+0

Być może nie wybrałem właściwego pytania, ale [tak, jest to możliwe] (http://meta.stackexchange.com/questions/147643/?hl=pl&hl=pl-to-to-to-close-a-duplicate-question-even- choć-jego-dużo-nowszy-i-ha/147651 # 147651) – styvane

Odpowiedz

24

Można ustawić opcje dla bazowego środowiska Werkzeug użyciu 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() 
+0

Dzięki, działa idealnie, ale trzeba dodać, że na każde połączenie będzie nudne. Znajomy dał mi rozwiązanie problemu, które zmienia każde połączenie. Zamieszczam to również jako odpowiedź. – moodh

+0

+1 Wygląda na to, że chciałeś to zrobić werkzeug i właśnie tego szukałem. –

+0

Teraz moje testy przechodzą w instancjach, które muszą mieć poprawny adres IP. Dzięki. – iChux

9

Znajomy dał mi to rozwiązanie, które działa we wszystkich żądań:

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(...) 
Powiązane problemy