在烧瓶单元测试中超越flask.g

时间:2014-04-19 02:10:50

标签: python unit-testing flask flask-login

我正在尝试为使用OpenID进行身份验证的烧瓶应用编写一些单元测试。由于似乎没有办法通过OpenID登录测试客户端(我问了这个问题,但它没有收到任何响应:Flask OpenID unittest),我想在我的测试中覆盖g.user,所以我尝试了http://flask.pocoo.org/docs/testing/#faking-resources-and-context的代码段,它按预期工作。

不幸的是,当使用flask-login时,g.user被覆盖在设置的before_request包装器中

g.user = current_user

current_user是匿名的,所以我的测试用例被破坏了。一个解决方法是仅在测试模式下执行before_request包装器代码,但是您需要在生产代码中添加特定于测试的逻辑。我也试过搞乱请求上下文,但g.user最终仍会被覆盖。有什么想法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

基于另一个问题in a Flask unit-test, how can I mock objects on the request-global `g` object?,对我有用的是:

在我的应用程序中,我将before_request中包含的登录逻辑重构为一个单独的函数。然后,我在测试中对该函数进行了修补,以使其返回要用于一堆测试的特定用户。 before_request仍与测试一起运行,但是通过修补它调用的功能,我现在可以避免实际的登录过程。

我不确定这是最干净的方法,但是我认为这比在before_request中添加仅测试逻辑更好;只是重构。