运行单个Flask Unittest通过但运行所有测试会产生AssertionError

时间:2015-06-30 15:55:01

标签: python flask nosetests flask-restful

我有使用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子类:UsersListAPIUsersAPI。 (如果你看到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 个答案:

答案 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对象不再是全球性的,但我认为我不需要其他地方。