【问题标题】:Data saved in session in a view is not saved in pytest session. Why?视图中保存在会话中的数据不会保存在 pytest 会话中。为什么?
【发布时间】:2023-01-28 05:53:45
【问题描述】:

我正在用 Django 制作一个网站,并想用 pytest 测试存储在会话中的数据。

我有一个非常简单的观点:

def dev_my_view(request):
    if request.method == "POST":
        post_data = json.loads(request.body.decode("utf-8"))
        product_id = post_data["productid"]
        request.session["basket"] = {"id": product_id}

        # print(request.session.items()) returns 
        # dict_items([('foo', 'bar'), ('basket', {'id, '99'})])
        # as expected

        response = JsonResponse({"id": f"product number {product_id}"})
        return response

这是我写的测试:

class TestViewsWithSession(TestCase):
    def test_my_view(self):
        session = self.client.session
        session["foo"] = "bar"
        session.save()
        url = reverse("home_page:my_view")
        response = self.client.post(
            url,
            json.dumps({"productid": "99"}),
            content_type="application/json",
        )

        # print(session.items()) returns 
        # dict_items([('foo', 'bar')])
               
        # Test passes
        self.assertEqual(response.status_code, 200)

        # Test passes
        # response.content = b'{"id": "product number 99"}
        self.assertJSONEqual(response.content, {"id": "product number 99"})

        # Test fails. KeyError: 'basket'
        self.assertEqual(
            session["basket"],
            {"id": "99"},
        )
        self.assertNotEqual(
            session["basket"],
            {"id": "Invalid value"},
        )

当我在测试 (session["foo"] = "bar") 中向会话添加数据时,会话在视图中包含此数据。

但是,看起来它不能以其他方式工作......

当一些数据被添加到视图(request.session["basket"] = {"id": product_id})中的会话时,我在测试中看不到这些数据。为什么 ?

【问题讨论】:

  • 你有没有得到答案?我有同样的问题。

标签: python django pytest django-sessions


【解决方案1】:

测试客户端使用与视图中使用的会话引擎不同的会话引擎。存储在视图中的会话数据不会“传输”到测试。

但是可以像这样直接从请求对象访问会话数据:

def test_my_view(self):
    session = self.client.session
    session["foo"] = "bar"
    session.save()
    url = reverse("home_page:my_view")
    response = self.client.post(
        url,
        json.dumps({"productid": "99"}),
        content_type="application/json",
    )

    request = response.wsgi_request
    self.assertEqual(
        request.session["basket"],
        {"id": "99"},
    )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 2019-07-15
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多