保存在视图会话中的数据不会保存在pytest会话中.为什么?



我正在用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})中向会话添加一些数据时,我无法在测试中看到这些数据。为什么?

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

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

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"},
)

最新更新