13

我正在为我的 Flask Web 应用程序编写一些单元测试,并尝试测试匿名用户和登录用户发出的请求之间的响应差异。

我正在使用Flask-Login扩展来实现用户登录/注销。

显然我可以执行匿名请求,但是如何模拟来自登录用户的请求?

我认为在标题中发送sessioncookie 就足够了,但它不起作用。

headers = Headers({'Cookie':['WEBSITE_ID=%s; Domain=adsabs.harvard.edu; expires=Thu, 25-Apr-2213 16:53:22 GMT; Path=/' % cookie_value, 
                             'WEBSITE_ID=%s; Domain=.adsabs.harvard.edu; expires=Thu, 25-Apr-2213 16:53:22 GMT; Path=/' % cookie_value,
                             'session="A VERY LONG STRING"; Path=/; HttpOnly',
                 ]})
rv = app.test_client().get('/', headers=headers)

会话 cookie 值是我从浏览器中的真实登录中获得的值。

我错过了什么?

4

2 回答 2

23

Flask-Loginuser_id在会话中查找,您可以在测试中使用session_transaction

with app.test_client() as c:
    with c.session_transaction() as sess:
        sess['user_id'] = 'myuserid'
        sess['_fresh'] = True # https://flask-login.readthedocs.org/en/latest/#fresh-logins
    resp = c.get('/someurl')

您的用户对象myuserid的 id在哪里。

于 2013-04-26T14:08:02.177 回答
0

DazWorrall 的答案在我复制它 ~2019 时有效,但是当我更新到 Flask 和 Flask-Login 的最新版本时,我需要在 user_id 上加上下划线前缀,即sess['user_id'] = 'myuserid'. 更好的是,使用https://github.com/maxcountryman/flask-login/pull/431有一个抽象,因此测试现在看起来像:

   test_app.test_client_class = FlaskLoginClient
   user = my_model.User.query.get(1)
   with test_app.test_client(user=user) as c:
      c.get('/admin/place/edit/?id=3')  # Request is logged in
于 2022-01-07T23:52:49.990 回答