2017-04-09 2 views
0

Ich führe Unittests in einer Flask App und ich bekomme 404, wenn views.py Datei nicht importiert wird, obwohl es nicht verwendet wird. Ich habe so tests.py Paket:Flask gibt 404 in Ansichten zurück

import unittest 

from presence_analyzer import main, utils 
from presence_analyzer import views 

class PresenceAnalyzerViewsTestCase(unittest.TestCase): 

    def setUp(self): 
     self.client = main.app.test_client() 

    def test_mainpage(self): 
     resp = self.client.get('/') 
     self.assertEqual(resp.status_code, 302) 

Wenn ich löschen Ansichten importieren das beschriebene Problem auftritt. Ansichten werden in ähnlicher Weise dazu organisiert:

from presence_analyzer.main import app 

@app.route('/') 
def mainpage(): 

    return redirect('/static/presence_weekday.html') 

Und die main.py Datei:

import os.path 
from flask import Flask 


app = Flask(__name__) # pylint: disable=invalid-name 
app.config.update(
    DEBUG=True, 
) 

Ich denke, es ist etwas, ähnlich dem, was passiert ist in this case, so versuche ich, um die Anwendung zu ändern, so dass Ich muss diese dummen Importe beim Testen nicht machen. Ich habe versucht, die Antwort von oben zu verwenden, aber immer noch kann es nicht funktionieren und these docs scheinen nicht hilfreich. Was mache ich falsch? main.py:

from flask.blueprints import Blueprint 

PROJECT_NAME = 'presence_analyzer' 

blue_print = Blueprint(PROJECT_NAME, __name__) 

def create_app(): 
    app_to_create = Flask(__name__) # pylint: disable=invalid-name 
    app_to_create.register_blueprint(blue_print) 
    return app_to_create 

app = create_app() 

views.py:

from presence_analyzer.main import app, blue_print 

@blue_print.route('/') 
def mainpage(): 

    return redirect('/static/presence_weekday.html') 

Und tests.py ist unverändert geblieben.

+1

Sie importieren keine 'Ansichten', daher wird die Route nie registriert. – davidism

+0

Ich habe darüber geschrieben. Ich suche nach einer Möglichkeit, diesen Import nicht mehr aufrufen zu müssen. Soweit ich die Antwort verstehe, die ich dort verlinkt habe, gibt es eine Möglichkeit, dies nicht tun zu müssen. – gonczor

+0

Sie müssen Dinge importieren, die Sie ausführen möchten. Es gibt keinen Weg dahin. – davidism

Antwort

1

Sie müssen views importieren oder die Route wird nicht registriert. Nein, Sie führen die Sichten nicht direkt aus, aber der Import führt den gesamten Code auf Modulebene aus. Ausführen von Codeaufrufen route. route registriert die Ansichtsfunktion. Sie können nicht herumkommen, müssen ein Modul importieren, um das Modul zu verwenden.