2016-09-27 5 views
1

Ich bin davon verblüfft. Ich verwende eine Anwendungs-Factory in einer Flask-Anwendung und unter der Testkonfiguration geben meine Routen immer 404s zurück.404 Antwort beim Ausführen FlaskClient Testmethode

Allerdings, wenn ich Flask-Script verwenden und die App aus dem Dolmetscher alles laden funktioniert wie erwartet, die Antwort kommt zurück als 200.

an die URL Navigation mit dem Browser funktioniert

app/__init__.py

def create_app(): 
app = Flask(__name__) 
return app 

sever1.py

from flask import Flask 
from flask_script import Manager 
from app import create_app 

app = create_app() 
app_context = app.app_context() 
app_context.push() 
manager = Manager(app) 


@app.route('/') 
def index(): 
return '<h1>Hello World!</h1>' 

@app.route('/user/<name>') 
def user(name): 
return '<h1>Hello, %s!</h1>' % name 

@manager.command 
def test(): 
"""Run the unit tests""" 
import unittest 
tests = unittest.TestLoader().discover('tests') 
unittest.TextTestRunner(verbosity=2).run(tests) 


if __name__ == '__main__': 
manager.run() 

Tests/test.py

#imports committed 
def setUp(self): 
    self.app = create_app('testing') 
    self.app_context = self.app.app_context() 
    self.app_context.push() 
    self.client = self.app.test_client() 

def test_app_exists(self): 
    response = self.client.get('/', follow_redirects=True) 
    print(response) #404 :(
    self.assertTrue("Hello World!" in response.get_data()) #this is just an example of how it fails 

Antwort

3

Sie sind das Werk Muster nicht richtig verwendet wird. Sie sollten Blueprints verwenden, um Routen zu sammeln und sie mit der App in der Fabrik zu registrieren. (Oder verwenden Sie app.add_url_rule in der Fabrik.) Nichts außerhalb der Fabrik sollte die App beeinflussen.

Sie erstellen gerade eine Instanz der App und verwenden diese Instanz dann zum Registrieren von Routen. Dann erstellen Sie in Ihren Tests eine andere Instanz, in der die Routen nicht registriert sind. Da diese Instanz keine registrierten Routen hat, gibt sie 404 für Anforderungen an diese URLs zurück.

Stattdessen registrieren Sie Ihre Routen mit einem Blueprint, dann registrieren Sie den Blueprint mit der App in der Fabrik. Verwenden Sie das Werk, um während der Tests eine App zu erstellen. Übergeben Sie die Factory an den Flask-Script-Manager. Sie sollten den App-Kontext nicht manuell drücken müssen.

from flask import Flask, Blueprint 
from flask_script import Manager 
from unittest import TestCase 


bp = Blueprint('myapp', __name__) 

@bp.route('/') 
def index(): 
    return 'Hello, World!' 

def create_app(config='dev'): 
    app = Flask(__name__) 
    # config goes here 

    app.register_blueprint(bp) 

    return app 

class SomeTest(TestCase): 
    def setUp(self): 
     self.app = create_app(config='test') 
     self.client = self.app.test_client() 

    def test_index(self): 
     rv = self.client.get('/') 
     self.assertEqual(rv.data, b'Hello, World!') 

manager = Manager(create_app) 
manager.add_option('-c', '--config', dest='config', required=False) 

if __name__ == '__main__': 
    manager.run() 
Verwandte Themen