【问题标题】:Flask OpenID unittestFlask OpenID 单元测试
【发布时间】:2014-02-09 05:13:27
【问题描述】:

我正在尝试为 OpenID 的烧瓶应用编写单元测试,但在调用时

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

我收到一个错误:

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

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

  1. 使用 NoExtRef 烧瓶扩展伪装 oid 提供程序。我不确定这在应用程序级别是否可行,因为我假设 flask-openid 与 oid url 混淆(当我尝试它时它只是将我重定向到原始页面)。但这看起来很丑陋,因为我正在严格为单元测试进行代码更改。
  2. 创建我自己的 oid 服务器,但这可能仍然是一个外部重定向(我会在以后绝望的时候尝试这个)。

我想另一种选择是忽略为登录编写单元测试,而只是使用很棒的 Flask 测试框架在 Flask.g 中设置用户。但我更愿意保留登录单元测试。

【问题讨论】:

    标签: flask openid flask-extensions


    【解决方案1】:

    还有一个替代方案——monkey-patch 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
    

    【讨论】:

    • 响应有点晚,但这种方法效果很好。感谢您向我介绍猴子补丁!
    【解决方案2】:

    如果您正在修补登录,则可能没有对其进行测试。

    我遇到了同样的问题。对我来说,最好的解决方案是禁用视图的“需要登录”部分。

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

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

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

    附:这是我在 Stack Overflow 上的第一篇文章。感谢所有对我帮助很大的海报!

    【讨论】:

      猜你喜欢
      • 2015-09-06
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-25
      • 2016-12-02
      • 1970-01-01
      相关资源
      最近更新 更多