Flask 应用单元测试期间无法创建测试客户端
Can't create test client during unit test of Flask app
我正在尝试找出如何 运行 对从 session['user_id']
获取变量值的函数进行测试。这是具体的测试方法:
def test_myProfile_page(self):
with app.test_client() as c:
with c.session_transaction() as sess:
sess['user_id'] = '1'
rv = c.get('/myProfile')
assert 'My Profile' in rv.data
这是正在测试的视图:
@app.route('/myProfile')
def myProfile():
if not session.get('logged_in'):
return render_template('login.html')
else:
profileID = session['user_id']
userList = users.query.filter_by(id=profileID).all()
flash('My Profile')
return render_template('myProfile.html', userList=userList)
这是整个测试文件:
import os
import app
import unittest
import tempfile
class AppTestCase(unittest.TestCase):
def setUp(self):
self.db_fd, app.app.config['DATABASE'] = tempfile.mkstemp()
app.app.config['TESTING'] = True
self.app = app.app.test_client()
def tearDown(self):
os.close(self.db_fd)
os.unlink(app.app.config['DATABASE'])
def test_profile_page(self):
rv = self.app.get('/profile1')
assert 'Profile' in rv.data
def login(self, username, password):
return self.app.post('/login', data=dict(
username=username,
password=password
), follow_redirects=True)
def logout(self):
return self.app.get('/logout', follow_redirects=True)
def test_login_logout(self):
rv = self.login('Alex', 'passwordAlex')
assert 'Welcome' in rv.data
rv = self.logout()
assert 'You have been logged out' in rv.data
rv = self.login('Alex', 'noPassword')
assert 'You have to Login' in rv.data
rv = self.login('WrongName', 'passwordAlex')
assert 'You have to Login' in rv.data
def test_myProfile_page(self):
with app.test_client() as c:
with c.session_transaction() as sess:
sess['user_id'] = '1'
rv = c.get('/myProfile')
assert 'My Profile' in rv.data
if __name__ == '__main__':
unittest.main()
运行测试时出现如下错误:
ERROR: test_myProfile_page (__main__.AppTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "app_tests.py", line 46, in test_myProfile_page
with app.test_client() as c:
AttributeError: 'module' object has no attribute 'test_client'
----------------------------------------------------------------------
Ran 3 tests in 0.165s
FAILED (errors=1)
为什么会出现此错误,我该如何解决?
您已经在 setUp
方法中创建了一个测试客户端:self.app
。 app
是您在顶部导入的模块,您需要引用 app.app
处的 app 对象才能获取 Flask 应用程序。由于您已经创建了一个测试客户端,您可以将测试更改为:
def test_myProfile_page(self):
with self.app as c:
with self.app.session_transaction() as sess:
sess['user_id'] = 1
sess['logged_in'] = True
rv = self.app.get('myProfile')
assert 'My Profile' in rv.data
我正在尝试找出如何 运行 对从 session['user_id']
获取变量值的函数进行测试。这是具体的测试方法:
def test_myProfile_page(self):
with app.test_client() as c:
with c.session_transaction() as sess:
sess['user_id'] = '1'
rv = c.get('/myProfile')
assert 'My Profile' in rv.data
这是正在测试的视图:
@app.route('/myProfile')
def myProfile():
if not session.get('logged_in'):
return render_template('login.html')
else:
profileID = session['user_id']
userList = users.query.filter_by(id=profileID).all()
flash('My Profile')
return render_template('myProfile.html', userList=userList)
这是整个测试文件:
import os
import app
import unittest
import tempfile
class AppTestCase(unittest.TestCase):
def setUp(self):
self.db_fd, app.app.config['DATABASE'] = tempfile.mkstemp()
app.app.config['TESTING'] = True
self.app = app.app.test_client()
def tearDown(self):
os.close(self.db_fd)
os.unlink(app.app.config['DATABASE'])
def test_profile_page(self):
rv = self.app.get('/profile1')
assert 'Profile' in rv.data
def login(self, username, password):
return self.app.post('/login', data=dict(
username=username,
password=password
), follow_redirects=True)
def logout(self):
return self.app.get('/logout', follow_redirects=True)
def test_login_logout(self):
rv = self.login('Alex', 'passwordAlex')
assert 'Welcome' in rv.data
rv = self.logout()
assert 'You have been logged out' in rv.data
rv = self.login('Alex', 'noPassword')
assert 'You have to Login' in rv.data
rv = self.login('WrongName', 'passwordAlex')
assert 'You have to Login' in rv.data
def test_myProfile_page(self):
with app.test_client() as c:
with c.session_transaction() as sess:
sess['user_id'] = '1'
rv = c.get('/myProfile')
assert 'My Profile' in rv.data
if __name__ == '__main__':
unittest.main()
运行测试时出现如下错误:
ERROR: test_myProfile_page (__main__.AppTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "app_tests.py", line 46, in test_myProfile_page
with app.test_client() as c:
AttributeError: 'module' object has no attribute 'test_client'
----------------------------------------------------------------------
Ran 3 tests in 0.165s
FAILED (errors=1)
为什么会出现此错误,我该如何解决?
您已经在 setUp
方法中创建了一个测试客户端:self.app
。 app
是您在顶部导入的模块,您需要引用 app.app
处的 app 对象才能获取 Flask 应用程序。由于您已经创建了一个测试客户端,您可以将测试更改为:
def test_myProfile_page(self):
with self.app as c:
with self.app.session_transaction() as sess:
sess['user_id'] = 1
sess['logged_in'] = True
rv = self.app.get('myProfile')
assert 'My Profile' in rv.data