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
  • Вопрос задан
  • 47 просмотров
Решения вопроса 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 . Далее сравниваем этот список с отсортированным как нам надо списком, они должны быть одинаковы.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы