首页 文章

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

提问于
浏览
3

我有使用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子类: 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 回答

  • 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 对象不再是全局的,但我不需要其他地方 .

相关问题