会话值简单函数测试失败
第一次没有提供足够的信息,所以我再试一次。我有以下这个函数:
def do_login(user):
"""Log in user."""
session["curr_user"] = user.id
还有这个函数:
@app.before_request
def add_user_to_g():
"""If we're logged in, add curr user to Flask global."""
if "curr_user" in session:
# updating to more current syntax
g.user = db.session.query(User).get(session["curr_user"])
else:
g.user = None
这两个函数是我在我的flask应用中用来保持用户登录的方法。它会把用户的ID放到浏览器的会话中,然后可以把这个ID添加到flask的全局对象里。我知道这些函数是有效的,因为用户可以在前端执行需要身份验证的操作,说明它们确实在正常工作。
不过,下面这个测试:
class UserViewTestCase(TestCase):
"""Test views for users."""
def setUp(self):
"""Create test client, add sample data."""
User.query.delete()
Message.query.delete()
self.client = app.test_client()
self.testuser = User.signup(username="testuser",
email="test@test.com",
password="testuser",
image_url=None,
header_image_url=None,
bio=None,
location=None)
self.testuser2 = User.signup(username='testuser2',
email='test2@test.com',
password='testuser',
image_url=None,
header_image_url=None,
bio=None,
location=None)
db.session.commit()
self.msg1 = Message(text="testing 1", user_id = self.testuser.id)
self.msg2 = Message(text="testing 2", user_id = self.testuser2.id)
db.session.add_all([self.msg1, self.msg2])
db.session.commit()
self.testuser.following.append(self.testuser2)
db.session.add(self.testuser)
db.session.commit()
def test_do_login(self):
"""Does do_login function work?"""
with app.test_request_context():
with self.client as c:
with c.session_transaction() as session:
do_login(self.testuser)
self.assertEqual(session["curr_user"], self.testuser.id)
却出现了KeyError错误。我知道这意味着在浏览器的会话中没有curr_user
的值,但我不明白为什么测试不成功,而实际的网站却能正常工作。我猜我在测试中对会话的处理做错了什么,但我就是搞不清楚是什么问题。
1 个回答
-1
你的测试代码试图两次访问 session[CURR_USER_KEY]
:第一次是在 do_login
函数里,第二次是在调用 self.assertEqual
的时候。如果这个键不存在,那么 do_login
就会抛出一个错误。
如果这是你预期的行为,那么你应该使用 self.assertRaises
来执行这个函数,这样你就可以测试是否真的抛出了 KeyError
这个错误。
def test_do_login(self):
"""Does do_login function work?"""
with app.test_request_context():
with self.client as c:
with c.session_transaction() as session:
with self.assertRaises(KeyError):
do_login(self.testuser)
如果这不是你预期的行为,并且 do_login
应该是往会话里 添加 一条记录,以便
self.assertEqual(session[CURR_USER_KEY], self.testuser.id)
能够成功,那么你就发现了 do_login
中的一个错误,需要修复它。