2016-09-27 32 views
1

我對此感到莫名其妙。我在Flask應用程序中使用應用程序工廠,在測試配置下,我的路線始終返回404s。404運行FlaskClient測試方法時的響應

然而,當我用瓶腳本並加載從解釋一切正常的應用程序,響應回來爲200

導航與瀏覽器的URL工作正常

應用程序/ __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() 

測試/

#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 

回答

3

你沒有正確使用工廠模式test.py。您應該使用藍圖收集路線並在工廠中將其註冊到應用程序中。 (或者在工廠使用app.add_url_rule)。工廠以外的任何應用程序都不會影響應用程序。

現在您創建應用程序的實例,然後使用該實例註冊路線。然後在測試中創建一個不同的實例,該實例沒有註冊路由。由於該實例沒有任何已註冊的路由,因此它會向這些URL發送請求返回404。

取而代之的是,用藍圖註冊您的路線,然後在工廠註冊藍圖與應用程序。在測試過程中使用工廠創建應用程序。將工廠傳遞給Flask-Script管理器。您不需要手動推送應用程序上下文。

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() 
相關問題