Как проверить в юнит-тестах в Django, что в контексте ответа тот же заказ, который был создан перед тестом?
Напишите тест для OrderDetailView.
Объявите класс тестов OrderDetailViewTestCase.
В setUpClass создайте пользователя и добавьте пользователю необходимые разрешения для просмотра заказа (“shopapp.view_order”).
Добавьте удаление пользователя в tearDownClass.
При помощи метода setUp сделайте вход пользователя и создание заказа для дальнейшего теста.
В методе tearDown сделайте удаление заказа.
Объявите метод test_order_details для проверки получения заказа:
- убедитесь, что в теле ответа есть адрес заказа;
- убедитесь, что в теле ответа есть промокод;
- убедитесь, что в контексте ответа тот же заказ, который был создан перед тестом (сравните по первичному ключу).
Это models.py
class Order(models.Model):
delivery_address = models.TextField(null=True, blank=True)
promocode = models.CharField(max_length=20, null=False, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(User, on_delete=models.PROTECT)
products = models.ManyToManyField(Product, related_name="orders")
Это views.py:
class OrderDetailView(DetailView):
queryset = (
Order.objects
.select_related("user")
.prefetch_related("products")
)
Это tests.py:
from django.contrib.auth.models import User, Permission
from django.test import TestCase
from django.urls import reverse
from .models import Order
class OrderDetailViewTestCase(TestCase):
@classmethod
def setUpClass(cls):
cls.user = User.objects.create(username='test', password='qwerty')
permission_order = Permission.objects.get(codename='view_order')
cls.user.user_permissions.add(permission_order)
@classmethod
def tearDownClass(cls):
cls.user.delete()
def setUp(self) -> None:
self.client.force_login(self.user)
self.order = Order.objects.create(
delivery_address='ul Verona, d 13',
promocode='SALE_123',
user=self.user)
def tearDown(self) -> None:
self.order.delete()
def test_order_details(self):
response = self.client.get(reverse(
'shopapp:order_details',
kwargs={'pk': self.order.pk})
)
self.assertContains(response, self.order.delivery_address)
self.assertContains(response, self.order.promocode)
Не знаю, как проверить, что в контексте ответа тот же заказ, который был создан перед тестом. Прошу помощи
Ответы (1 шт):
Не знаю, актуален ли еще вопрос, но сам столкнулся с такой задачкой и потому делюсь решением.
Для начала нужно обратиться к контексту ответа, так как это TemplateResponse, чтобы получить первичный ключ созданного объекта (заказа) и сохранить в переменную:
received_data = response.context["order"].pk
В другой переменной сохранить ожидаемую инфу по первичному ключу заказа, который создавался в тесте:
expected_data = self.order.pk
Ну и в конце, просто сравнить ключи:
self.assertEqual(received_data, expected_data)