Задать вопрос
Seletach
@Seletach
Начинающий бекендер

Как проверить сортировку комментариев от старых к новым в Pytest?

Существует вот такой тест на pytest:

@pytest.mark.django_db
def test_comments_order(client, news, a_lot_of_comments):
    """Проверка сортировки комментариев от старых к новым."""
    url = reverse('news:detail', args=(news.id,))
    response = client.get(url)
    news = response.context['news'] # тут лежит объект новости
    all_comments = [''] # как достать комменты
    sorted_dates = sorted(all_comments, reverse=False)
    assert all_comments == sorted_dates

Мне необходимо проверить что все комментарии в объекте новости отсортированы от старых к новым, но как мне это проверить? у меня есть фикстуры со множеством комментов:
@pytest.fixture
def a_lot_of_comments(news, author):
    for i in range(10):
        news = News.objects.create(
            title='Заголовок',
            text='Текст заметки',
        )
        comment = Comment.objects.create(
            text=f'Текст заметки {i}',
            author=author,
            news_id=news.id,
        )
        comment.save()

и фикстура новости:
@pytest.fixture
def news():
    news = News.objects.create(
        title='Заголовок',
        text='Текст новости',
    )
    return news
  • Вопрос задан
  • 74 просмотра
Подписаться 1 Простой 2 комментария
Решения вопроса 1
Seletach
@Seletach Автор вопроса
Начинающий бекендер
Итак, ответ на мой вопрос. Фикстура и сам тест были неправильными.
Вот правильный тест:

def test_comments_order(client, a_lot_of_comments, url_detail):
    """Проверка сортировки комментариев от старых к новым."""
    response = client.get(url_detail)
    response.context['news']
    all_comments = [comment.created for comment in Comment.objects.all()]
    sorted_dates = sorted(all_comments, reverse=False)
    assert all_comments == sorted_dates

Но этот тест не будет работать без правильной фикстуры:

@pytest.fixture
def a_lot_of_comments(news, author):
    now = datetime.now()
    for i in range(10):
        comment = Comment.objects.create(
            text=f'Текст комметария {i}',
            author=author,
            news_id=news.id,
        )
        comment.created = now + timedelta(days=i)
        comment.save()

В фикстуре возвращать что либо или добавлять в список каждый комментарий не нужно, достаточно заполнить БД вписав фикстуру в параметры функции.

А затем достать всё объекты из временной БД Comment.objects.all() и перебрав комменты по дате создания, засунуть их в список all_comments . Далее сравниваем этот список с отсортированным как нам надо списком, они должны быть одинаковы.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Strikt Москва
от 100 000 до 180 000 ₽
ITK academy Саратов
от 75 000 ₽
Sim-Ba Pay Санкт-Петербург
от 180 000 ₽