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