2

我正在尝试为 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 中设置用户。但我更愿意保留登录单元测试。

4

2 回答 2

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
于 2014-04-20T01:56:19.377 回答
0

如果您正在修补登录,您可能没有在测试它。

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

我不知道您是否正在使用 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()

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

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

于 2014-06-14T05:36:08.950 回答