Flask OpenID unittest

时间:2014-02-09 05:13:27

标签: flask openid flask-extensions

我正在尝试为OpenID的烧瓶应用程序编写单元测试但是在调用

oid.try_login(<oid provider>, <params>)

我收到错误:

  

RuntimeError:<class 'flask.testing.FlaskClient'>不支持重定向到外部目标

所以,就像每个优秀的SO用户一样,我四处寻找解决方案:

  1. 使用NoExtRef烧瓶扩展程序伪装oid提供程序。我不确定这是否可以在应用程序级别,因为我假设使用oid url烧瓶开放混乱(当我尝试它时它只是将我重定向到原始页面)。但这看起来非常难看,因为我正在严格地为单位测试进行代码更改。
  2. 创建我自己的oid服务器,但这可能仍然是一个外部重定向(我会在我绝望的时候再尝试这个)。
  3. 我想另一种选择是忽略编写单元测试以进行登录,并使用非常棒的Flask测试框架在Flask.g中设置用户。但我更愿意保留登录单元测试。

2 个答案:

答案 0 :(得分:1)

还有一种替代方案 - 使用open-id扩展程序try_login方法修补猴子:

class LoginTestMonkeyPatch(object):
    def __init__(self, oid=None, default_response=None):
        self.response = default_response
        if oid is not None:
            self.init(oid)

    def init(self, oid):
        oid.try_login = self.try_login


    def try_login(self, *args, **kwargs):
        # Do whatever you want to do here

答案 1 :(得分:0)

如果要修补登录,则可能无法对其进行测试。

我遇到了同样的问题。对我来说,最好的解决方案是禁用&#34;登录所需的&#34;观点的一部分。

我不知道您是否使用Flask登录,但如果您是,则可以绕过@login_required,这样您甚至不必担心尝试使用以下内容登录用户: / p>

def setUp
   env = Environments(app)
   env.from_object('config.Testing')
   lm = LoginManager()
   lm.init_app(app)
   self.app = app.test_client()

只是一个想法,我希望这可以帮助你或其他人:)

P.S。这是我在Stack Overflow上的第一篇文章。感谢所有帮助过我的海报!