Как подделать подсчет количества лайков для тестирования 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()