Выполнение однократной проверки флаконов проходит, но при выполнении всех тестов выдается ошибка AssertionError

У меня есть приложение Flask, которое использует библиотеку Flask-Restful. Моя структура приложения настроена так:

server
 application.py
- app
   users.py
  - tests
     test_users.py
- common
   tests.py

Моя настройка приложения определена в application.py, Я использую шаблон Factory.

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 для полного кода.

Я установил свой класс модульного теста в common/tests.py следуя этому фрагменту.

Я запускаю свои тесты, используя Нос. Когда я запускаю какой-либо отдельный тест, он проходит. Когда я запускаю все тесты, используя

$ nosetests

Я получаю следующую ошибку:

AssertionError: View function mapping is overwriting an existing endpoint function: users

Я думаю, что ошибка вызвана тем, что тестовый бегун пытается зарегистрировать другой ресурс Flask-Restful после того, как он уже зарегистрирован. В users.py у меня есть два подкласса ресурса: UsersListAPI а также UsersAPI, (Если вы видите страницу github, у меня также есть такая же настройка в trips.py.)

Я думал, что запуск одного TestCase не вызовет ошибку, потому что я звоню _pre_setup() в базовом случае один раз для TestCase, где создается тестовое приложение, но я все равно получаю сообщение об ошибке, если, например, я запускаю тест:

$ 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()

Примечание. Я импортирую TestCase как из flask.ext.testing, так и из unittest, очевидно, не одновременно, когда на самом деле выполняю тесты. Когда я импортирую из flask.ext.testcase, один тест не пройден. Импортирование из unittest одиночного теста проходит:

$ nosetests app.tests.test_users:UsersTest.test_get_all_users

В обоих случаях при запуске всех тестов или только теста UsersTest тесты не пройдены. Фактический тестовый файл test_users.py очень длинный. Я предоставлю это как суть. Я удалил весь лишний код и оставил только два теста. Если вы хотите увидеть полный тестовый файл, он находится в моем репозитории github.

1 ответ

Догадаться:

Я должен переместить линию 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 объект больше не глобален, но я не думаю, что он понадобится где-то еще.

Другие вопросы по тегам