Как проверить в юнит-тестах в Django, что в контексте ответа тот же заказ, который был создан перед тестом?

Рейтинг: 0Ответов: 1Опубликовано: 16.03.2023

Напишите тест для 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)

Не знаю, как проверить, что в контексте ответа тот же заказ, который был создан перед тестом. Прошу помощи

Ответы

▲ 0

Не знаю, актуален ли еще вопрос, но сам столкнулся с такой задачкой и потому делюсь решением.

Для начала нужно обратиться к контексту ответа, так как это TemplateResponse, чтобы получить первичный ключ созданного объекта (заказа) и сохранить в переменную:

received_data = response.context["order"].pk

В другой переменной сохранить ожидаемую инфу по первичному ключу заказа, который создавался в тесте:

expected_data = self.order.pk

Ну и в конце, просто сравнить ключи:

self.assertEqual(received_data, expected_data)