У меня есть приложение Flask, которое использует библиотеку Flask-Restful. У меня есть моя структура приложения настроить следующим образом:Running Single Flask Unittest Passes, но работает все тесты дает AssertionError
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
после этого snippet.
Я запускаю свои тесты с помощью носа. Когда я запускаю какой-либо один тест, он проходит. Когда я бег всех тестов с использованием
$ nosetests
Я получаю следующее сообщение об ошибке:
AssertionError: View function mapping is overwriting an existing endpoint function: users
Я думаю, что ошибка была вызвана испытываемым бегун пытается зарегистрировать другую Колбу-успокоительный ресурс после того, как они уже были зарегистрировано. В users.py у меня есть два подкласса Resource: UsersListAPI
и UsersAPI
. (Если вы видите страницу github, у меня также есть такая же настройка в trip.py.)
Я думал, что запуск одного TestCase не приведет к ошибке, потому что я вызываю _pre_setup()
в базовом случае один раз для TestCase, где создается тест приложение, но я все еще получаю ошибку, если, например, я запустить тест:
$ nosetests app.tests.test_users:UsersTest
я все еще получаю AssertionError
.
Любые мысли?
Редактировать: Вот мои тестовые файлы.
Базовый тестовый файл на общем/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 очень длинный. Я поставлю его как gist. Я удалил весь лишний код и оставил только два теста. Если вы хотите увидеть полный тестовый файл, он находится на моем github repo.
Можете ли вы разместить тестовый файл? Что вы делаете в методах setup/create_app для TestCase? – junnytony
Я попробовал запустить два теста «nosetests --tests = app.tests.test_users: UsersTest.test_get_user_by_username, app.tests.test_users: UsersTest.test_get_all_users». Первый тест проходит, а второй терпит неудачу с тем же AssertionError. Я действительно думаю, что тестовый бегун каким-то образом пытается создать экземпляр другого тестового приложения. – ericso
Я нашел это: https://github.com/mitsuhiko/flask/issues/1046, что очень похоже на мою проблему. В этом случае, однако, проблема заключалась в том, что файл views.py импортировался дважды, в результате чего был вызван вызов api.add_resource() дважды. В моем случае я обматываю вызовы add_resource в функции, вызываемой в create_app. – ericso