【问题标题】:Functional Testing a Flask App: Weird Twill TracebackFlask 应用程序的功能测试:奇怪的斜纹回溯
【发布时间】:2012-11-26 22:50:22
【问题描述】:

我正在测试我的 Flask 应用程序。

总之,这是我的问题:

1) 我在下面的代码块中的最终 url 断言失败。根据 Twill 的说法,它失败了,因为实际的 url 是'/auth/login'。换句话说,用户没有被重定向到受保护的管理页面。为什么?

2) 如何在我的 url 断言中包含“/?next='admin'”请求参数?换句话说,有没有一种方法——通过 Twill 或任何 Python 方式——来测试正确解析的“下一个”参数?

3) 在功能测试中,除了断言 301 状态代码之外,还有其他方法可以显示重定向的工作原理吗?

这是我的脚本中与斜纹相关的部分...

t.browser.go(t.url("/auth/login/?next=%2Fadmin%2F")) url("/auth/login/?next=%2Fadmin%2F")

这是最终的回溯:

TwillAssertionError: 当前 url 是 'http://127.0.0.1:5000/auth/login/?next=%2Fadmin%2F'; 不匹配 '/auth/login/?next=%2Fadmin%2F'

注意:奇怪的是,在“go”命令之后断言 200 状态代码不会返回任何类型的错误。我想表明,在登录上述 URL 后,最终 URL 确实是管理页面。就这样……

我想运行的测试没有失败,但不能...

def test_redirect_via_url(self): 使用 Twill(self.app, port=8080) 作为 t: #: 登录前进入管理页面... t.browser.go(t.url("/admin")) #: 断言 admin url 重定向到登录 url url('/auth/login') #: 上面的断言有效,但是...... #: 为什么我不能断言这个 URL..'next' 参数...? #: "/auth/login/?next=%2Fadmin%2F" #:这就是浏览器地址栏中实际出现的内容 #: 无论如何,在'/auth/login' url,让我们登录 fv("1", "用户名", "测试") fv("1", "密码", "welcome1") 提交() #: 现在我想展示我的应用实际上重定向到受保护的管理页面... #: 应该有一个 localhost/admin 的 URL 网址('/管理员') #: 上面的 url 断言失败。提交后的实际 url 仍然是 '/auth/login'

【问题讨论】:

    标签: python unit-testing flask functional-testing twill


    【解决方案1】:

    原因是twill.commands.url 断言它传递的 URL 与浏览器的 URL 相匹配,将其转换为正则表达式并与之匹配。这导致/auth/login/?next=%2Fadmin%2F 被翻译成:

    /auth/login       # Match this literal string
    /?                # followed by zero or one slash
    next=%2Fadmin%2F  # followed by this literal string
    

    这意味着它将匹配 /auth/login/next=%2Fadmin%2F/auth/loginnext=%2Fadmin%2F 但不匹配 /auth/login/?next=%2Fadmin%2F。一种解决方法是转义问号(url(r"/auth/login/\?next=%2Fadmin%2F") 应该可以工作)。

    【讨论】:

    • 谢谢你,肖恩!这确实是问题所在。另外:决定使用 Flask-fillin 作为登录表单,因为 Twill 不会在会话中存储登录信息……这是我最终 url 断言失败的另一个原因。
    猜你喜欢
    • 1970-01-01
    • 2010-12-22
    • 2017-10-05
    • 2013-10-27
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多