我有使用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中,我有我的Resource子类:
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 .
1 回答
弄清楚了:
我必须将
api = Api(prefix='/api/v0')
行移动到create_app
函数中,并将add_resource
函数移动到create_app
中:api
对象不再是全局的,但我不需要其他地方 .