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

efe*_*der 8 python unit-testing webtest flask flask-login

我正在测试我的烧瓶应用程序,它使用flask-login扩展.

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

class TestCase(unittest.TestCase):

    def setUp(self):
        app.config['TESTING'] = True
        self.client = webtest.TestApp(app)
Run Code Online (Sandbox Code Playgroud)

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

根据文档https://flask-login.readthedocs.org/en/latest/#protecting-views 和本讨论,将'TESTING'的配置值设置为True应该禁用登录要求,但这似乎不是为我工作

有什么建议?

tbi*_*icr 12

这是因为Flask-Login缓存TESTINGLOGIN_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)
Run Code Online (Sandbox Code Playgroud)


Esp*_*azi 5

烧瓶登录文档说:

在单元测试时可以方便地全局关闭身份验证。要启用此功能,如果应用程序配置变量 LOGIN_DISABLED 设置为 True,则此装饰器将被忽略。

如果您正在使用应用程序工厂设计模式,请将其添加到您的测试配置中:

LOGIN_DISABLED = True
Run Code Online (Sandbox Code Playgroud)

或者您可以在创建应用程序时添加它,如下所示:

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

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