会话值简单函数测试失败

0 投票
1 回答
41 浏览
提问于 2025-04-14 15:26

第一次没有提供足够的信息,所以我再试一次。我有以下这个函数:

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 中的一个错误,需要修复它。

撰写回答