我有使用Flask-Restful库的Flask应用程序。我的应用程序结构设置如下:
server
application.py
- app
users.py
- tests
test_users.py
- common
tests.py
我的应用程序设置在application.py
中定义。我正在使用工厂模式。
api = Api(prefix='/api/v0')
def create_app(config_filemane):
flask_app = Flask(__name__)
flask_app.config.from_object(config_filemane)
db.init_app(flask_app)
from app.users import add_user_resources
add_user_resources()
api.init_app(flask_app)
return flask_app
在users.py中,我有我的资源子类:
class UserListAPI(Resource):
def __init__(self):
super(UserListAPI, self).__init__()
def get(self):
def post(self):
class UserAPI(Resource):
def __init__(self):
super(UserAPI, self).__init__()
def get(self, id):
def put(self, id):
def delete(self, id):
def add_user_resources():
api.add_resource(UserListAPI, '/users', endpoint='users')
api.add_resource(UserAPI, '/users/<id>', endpoint='user')
请参阅我的github页面了解完整代码。
我在snippet之后common/tests.py
设置了我的单元测试课程。
我使用Nose运行我的测试。当我运行任何单个测试时,它会通过。当我使用
运行所有测试时$ nosetests
我收到以下错误:
AssertionError: View function mapping is overwriting an existing endpoint function: users
我认为错误是由测试运行员在注册后尝试注册另一个Flask-Restful资源引起的。在users.py中,我有两个Resource子类:UsersListAPI
和UsersAPI
。 (如果你看到github页面,我在trips.py中也有相同的设置。)
我认为运行单个TestCase不会引发错误,因为我在基础案例中为TestCase调用_pre_setup()
,其中测试应用程序已创建,但是如果,我仍然会收到错误例如,我运行测试:
$ nosetests app.tests.test_users:UsersTest
我仍然得到AssertionError
。
有什么想法吗?
编辑:这是我的测试文件。
common / tests.py上的基本测试文件:
from flask.ext.testing import TestCase
from unittest import TestCase
from application import create_app
class BaseTestCase(TestCase):
def __call__(self, result=None):
self._pre_setup()
super(BaseTestCase, self).__call__(result)
self._post_teardown()
def _pre_setup(self):
self.app = create_app('settings_test')
self.client = self.app.test_client()
self._ctx = self.app.test_request_context()
self._ctx.push()
def _post_teardown(self):
self._ctx.pop()
注意我从flask.ext.testing和unittest导入TestCase,显然不是在实际运行测试的同时。当我从flask.ext.testcase导入时,单个测试失败。从unittest导入单个测试通过:
$ nosetests app.tests.test_users:UsersTest.test_get_all_users
在这两种情况下,运行所有测试或仅运行UsersTest测试用例,测试都会失败。实际的测试文件test_users.py非常长。我会将其作为gist提供。我删除了所有多余的代码,只留下了两个测试。如果您想查看完整的测试文件,请访问我的github repo。
答案 0 :(得分:2)
想出来:
我必须将行api = Api(prefix='/api/v0')
移到函数create_app
中,并将add_resource
函数移动到create_app
中:
def create_app(config_filemane):
flask_app = Flask(__name__)
...
api = Api(prefix='/api/v0')
api.add_resource(UserListAPI, '/users', endpoint='users')
api.add_resource(UserAPI, '/users/<id>', endpoint='user')
...
return flask_app
api
对象不再是全球性的,但我认为我不需要其他地方。