使用flask-login对烧瓶进行单元测试时禁用@login_required

时间:2014-02-13 20:50:59

标签: python unit-testing flask webtest flask-login

我正在对使用flask-login扩展名的烧瓶应用进行单元测试。

我正在使用webtest设置我的所有测试:

class TestCase(unittest.TestCase):

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

但是当我尝试通过使用@login_required修饰的self.client.get()访问网址时,我收到401错误,并显示一条消息,表示我无权访问该网址。

根据文件https://flask-login.readthedocs.org/en/latest/#protecting-views 这个discussion, 将'TESTING'的配置值设置为True应该禁用登录要求,但这对我来说似乎不起作用。

有什么建议吗?

3 个答案:

答案 0 :(得分:10)

这是因为Flask-Login缓存TESTINGLOGIN_DISABLED init_apphttps://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)

答案 1 :(得分:1)

来自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)

希望这会有助于其他有同样问题的人

答案 2 :(得分:0)

我不确定这是否会有所帮助,但是:

在我的旧的flaskr项目文件中,我在“flaskr.py”文件中进行了配置,它们看起来像这样:

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

所以也许你会有

TESTING = True