2014-02-13 4 views
5

Я использую модульное приложение для моей фляги, в котором используется расширение для флажков.Отключение @login_required в то время как блок-тестирующая колба с флягой-логином

Я настраиваю все мои тесты, как это с помощью WebTest:

class TestCase(unittest.TestCase): 

    def setUp(self): 
     app.config['TESTING'] = True 
     self.client = webtest.TestApp(app) 

Но когда я пытаюсь посетить URLs через self.client.get(), которые оформлены с @login_required, я получаю сообщение об ошибке 401 с сообщением, что я не уполномочен на доступ к URL-адресу.

Согласно документации https://flask-login.readthedocs.org/en/latest/#protecting-views и это discussion, установки значения конфигурации из «ИСПЫТАНИЯ» в True, должны отключить требования входа, но не кажется, что работает для меня.

Любые предложения?

ответ

8

Это потому, что Flask-Login кэширование TESTING или LOGIN_DISABLED на init_app (https://github.com/maxcountryman/flask-login/blob/master/flask_login.py#L164).

Итак, если вы создаете приложение, а затем устанавливаете что-то в конфигурации, то изменения конфигурации будут игнорироваться.

Лучше всего использовать фабрику приложений с разделенными конфигурациями для производства и испытаний, а также уменьшить вероятность получения ошибок при не очищенном состоянии приложения в тестах.

Самый простой способ переинициализации login_manager:

class TestCase(unittest.TestCase): 
    def setUp(self): 
     app.config['TESTING'] = True 
     app.login_manager.init_app(app) 
     self.client = webtest.TestApp(app) 
+0

Кажется, работает с 'LOGIN_DISABLED', но не с' TESTING'. https://github.com/maxcountryman/flask-login/issues/216 – MikeiLL

0

Я не уверен, если это поможет, но:

в моем старом файле flaskr проекта, я имел конфигурации в моем файле «flaskr.py», и они выглядели так:

# configuration 
DATABASE = 'flaskr.db' 
DEBUG = True 
SECRET_KEY = 'development key' 
USERNAME = 'admin' 
PASSWORD = 'default' 

Так может быть, вы бы

TESTING = True 

?

+0

Как вы можете видеть из моего кода выше, я устанавливаю переменную конфигурации TESTING для перед каждым тестом. Во время отладки я проверил конфигурацию, и на самом деле для TESTING установлено значение True. – efeder

0

из flask login documentation он сказал, что:

Это может быть удобно глобально отключить проверку подлинности при блок тестирования. Чтобы включить это, если для параметра конфигурации приложения LOGIN_DISABLED установлено значение True, этот декоратор будет проигнорирован.

, если вы используете приложения фабричную модель добавить к вашей проверке конфигурации:

LOGIN_DISABLED = True 

или вы можете добавить его при создании приложения, как это:

class TestCase(unittest.TestCase): 
    def setUp(self): 
     app.config['LOGIN_DISABLED'] = True 
     self.client = webtest.TestApp(app) 

Надеется, что это помогите другим, у кого будет такая же проблема