Как подделать подсчет количества лайков для тестирования Django

Мне нужно протестировать это представление:

class ShowHomePageView(views.TemplateView):
    template_name = 'home_page.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        books = Book.objects.prefetch_related('likes'). \
                    filter(owner__isnull=False). \
                    annotate(like_count=Count('likes')). \
                    order_by('-like_count', 'title'). \
                    all()[:3]
        context['books_to_show'] = books
        return context

Это моя модель:

class Book(models.Model):
    TITTLE_MAX_LENGTH = 64
    AUTHOR_MAX_LENGTH = 64
    UPLOAD_PICTURE_MAX_SIZE_IN_MB = 2

    title = models.CharField(
        max_length=TITTLE_MAX_LENGTH,
    )

    author = models.CharField(
        max_length=AUTHOR_MAX_LENGTH,
    )

    category = models.ForeignKey(
        to=Category,
        null=True,
        blank=True,
        default='',
        on_delete=models.SET_DEFAULT,
    )

    image = CloudinaryField(
        "Image",
        null=True,
        blank=True,
        transformation={"quality": "auto:eco"},
        overwrite=True,
    )

    owner = models.ForeignKey(
        to=get_user_model(),
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name='own_books',
    )

    ex_owners = models.ManyToManyField(
        to=get_user_model(),
        related_name='ex_books',
        blank=True,

    )

    previous_owner = models.ForeignKey(
        to=get_user_model(),
        related_name='books_to_send',
        null=True,
        blank=True,
        on_delete=models.SET_NULL
    )

    next_owner = models.ForeignKey(
        to=get_user_model(),
        related_name='book_on_a_way',
        null=True,
        blank=True,
        on_delete=models.SET_NULL
    )

    likes = models.ManyToManyField(
        to=get_user_model(),
        related_name='liked_books',
        blank=True,
    )

    is_tradable = models.BooleanField(
        default=True,
    )

    @property
    def likes_count(self):
        return len(self.likes.all())

    def __str__(self):
        return f'"{self.title}" by {self.author}'

    class Meta:
        ordering = ['title']

    def get_absolute_url(self):
        return reverse('book_details', kwargs={'pk': self.pk})

Я понятия не имею, как проверить, получает ли представление 3 наиболее понравившиеся книги. Я легко создам несколько книг, но я не знаю, как подделать значение для подсчета лайков. Я мог бы вручную создать множество пользователей и добавить их в book.likes, но надеюсь, что есть другой более умный способ сделать это. Не могли бы вы дать мне несколько подсказок?

Вы можете использовать model_mommy или factory_boy для создания фиктивных объектов. После создания некоторых объектов вы можете поиздеваться над функциями.

with patch('path_your_model.Book.likes_count', return_value=3):
     # your test code

и еще одна вещь - есть функция orm для подсчета объектов.

@property
def likes_count(self):
    return self.likes.all().count()
Вернуться на верх