我目前正在尝试为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)
谢谢!
答案 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)
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')