2015-06-30 3 views
2

У меня есть приложение 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.

+0

Можете ли вы разместить тестовый файл? Что вы делаете в методах setup/create_app для TestCase? – junnytony

+0

Я попробовал запустить два теста «nosetests --tests = app.tests.test_users: UsersTest.test_get_user_by_username, app.tests.test_users: UsersTest.test_get_all_users». Первый тест проходит, а второй терпит неудачу с тем же AssertionError. Я действительно думаю, что тестовый бегун каким-то образом пытается создать экземпляр другого тестового приложения. – ericso

+0

Я нашел это: https://github.com/mitsuhiko/flask/issues/1046, что очень похоже на мою проблему. В этом случае, однако, проблема заключалась в том, что файл views.py импортировался дважды, в результате чего был вызван вызов api.add_resource() дважды. В моем случае я обматываю вызовы add_resource в функции, вызываемой в create_app. – ericso

ответ

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 больше не глобальный, но я дон Думаю, мне нужно в другом месте.

 Смежные вопросы

  • Нет связанных вопросов^_^