Печать данных сессии Django приводит к сбою тестов 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}
response = JsonResponse({"id": f"product number {product_id}"})
return response
<
# TEST PASSES OK
def test_my_view_OK(self):
the_session = self.get_session()
self.set_session_cookies(the_session)
url = reverse("home_page:my_view")
response = self.client.post(
url,
json.dumps({"productid": "99"}),
content_type="application/json",
)
self.assertEqual(response.status_code, 200)
self.assertJSONEqual(response.content, {"id": "product number 99"})
self.assertEqual(
the_session["basket"],
{"id": "99"},
)
self.assertNotEqual(
the_session["basket"],
{"id": "Invalid value"},
)
Но этот тест не работает...
# TEST KO
def test_my_view_KO(self):
the_session = self.get_session()
self.set_session_cookies(the_session)
print_session_in_tests(the_session)
# Session is empty, ok
url = reverse("home_page:my_view")
response = self.client.post(
url,
json.dumps({"productid": "99"}),
content_type="application/json",
)
print_session_in_tests(the_session)
# Session is empty, why ?
self.assertEqual(response.status_code, 200)
self.assertJSONEqual(response.content, {"id": "product number 99"})
# The following test fails. KeyError: 'basket'
self.assertEqual(
the_session["basket"],
{"id": "99"},
)
self.assertNotEqual(
the_session["basket"],
{"id": "Invalid value"},
)
Итак, похоже, что за это отвечает функция print_session_in_tests ... Почему
def print_session_in_tests(my_session):
print("----------// SESSION (test) //----------")
try:
for key, value in my_session.items():
print("{} >>> {}".format(key, value))
except:
pass
print("------- end of printing session ------")
pass
Для информации, мои тесты являются подклассом TestCase.
class SessionEnabledTestViews(TestCase):
def get_session(self):
if self.client.session:
session = self.client.session
else:
engine = import_module(django_settings.SESSION_ENGINE)
session = engine.SessionStore()
return session
def set_session_cookies(self, session):
# Set the cookie to represent the session
session_cookie = django_settings.SESSION_COOKIE_NAME
self.client.cookies[session_cookie] = session.session_key
cookie_data = {
"max-age": None,
"path": "/",
"domain": django_settings.SESSION_COOKIE_DOMAIN,
"secure": django_settings.SESSION_COOKIE_SECURE or None,
"expires": None,
}
self.client.cookies[session_cookie].update(cookie_data)
# * TEST KO
def test_my_view_KO(self):
# ...
# * TEST OK
def test_my_view_OK(self):
# ...