使用Python Unittest在Flask中测试重定向

时间:2014-04-18 01:56:05

标签: python unit-testing flask python-unittest

我目前正在尝试为Flask应用程序编写一些单元测试。在我的许多视图功能(例如我的登录)中,我重定向到新页面。例如:

@user.route('/login', methods=['GET', 'POST'])
def login():
    ....
    return redirect(url_for('splash.dashboard'))

我正在尝试验证此重定向是否发生在我的单元测试中。现在,我有:

def test_register(self):
    rv = self.create_user('John','Smith','John.Smith@myschool.edu', 'helloworld')
    self.assertEquals(rv.status, "200 OK")
    # self.assert_redirects(rv, url_for('splash.dashboard'))

此函数确保返回的响应为200,但最后一行显然不是有效的语法。我怎么能断言呢?我的create_user功能很简单:

def create_user(self, firstname, lastname, email, password):
        return self.app.post('/user/register', data=dict(
            firstname=firstname,
            lastname=lastname,
            email=email,
            password=password
        ), follow_redirects=True)

谢谢!

4 个答案:

答案 0 :(得分:11)

Flask有built-in testing hooks和一个测试客户端,它非常适合这样的功能。

from flask import url_for
import yourapp

test_client = yourapp.app.test_client()
response = test_client.get(url_for('whatever.url'), follow_redirects=True)

# check that the path changed
assert response.request.path == url_for('redirected.url')

文档提供了更多有关如何执行此操作的信息,尽管如果您看到“flaskr”,这是测试类的名称而不是Flask中的任何内容,这在我第一次看到它时会让我感到困惑。

答案 1 :(得分:9)

尝试Flask-Testing

assertRedirects有api可以使用此

assertRedirects(response, location)

Checks if response is an HTTP redirect to the given location.
Parameters: 

    response – Flask response
    location – relative URL (i.e. without http://localhost)

测试脚本:

def test_register(self):
    rv = self.create_user('John','Smith','John.Smith@myschool.edu', 'helloworld')
    assertRedirects(rv, url of splash.dashboard)

答案 2 :(得分:5)

一种方法是不遵循重定向(从请求中删除follow_redirects,或明确将其设置为False)。

然后,您只需将self.assertEquals(rv.status, "200 OK")替换为:

即可
self.assertEqual(rv.status_code, 302)
self.assertEqual(rv.location, url_for('splash.dashboard', _external=True))

如果由于某种原因想要继续使用follow_redirects,另一种(稍微脆弱)的方法是检查某些预期的仪表板字符串,例如rv.data响应中的HTML元素ID。例如self.assertIn('dashboard-id', rv.data)

答案 3 :(得分:0)

您可以使用Flask test client作为context manager(使用with关键字)来验证重定向后的最终路径。它允许保留最终的请求上下文,以便导入包含请求路径的request object

from flask import request, url_for

def test_register(self):
    with self.app.test_client() as client:
        user_data = dict(
            firstname='John',
            lastname='Smith',
            email='John.Smith@myschool.edu',
            password='helloworld'
        )
        res = client.post('/user/register', data=user_data, follow_redirects=True)
        assert res.status == '200 OK'
        assert request.path == url_for('splash.dashboard')