2016-09-27 14 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() 
相关问题