Django test assert not equal

Пытаюсь протестировать слой селекторов в моем приложении, но django не проходит простой тест. Querysets выглядит довольно похоже, может я что-то упустил.

test.py

from django.test import TestCase

from books.models import Author, Book
from books.selectors import get_books


class SelectorTest(TestCase):
    def setUp(self):
        self.author = Author.objects.create(
            name='test_author'
        )
        self.book = Book.objects.create(
            name='test_book',
            category='Drama',
            release_date='2001-01-01',
            author=self.author,
            is_read=True
        )

    def test_get_books(self):
         self.assertEqual(get_books(), Book.objects.all())

selectors.py

from django.db.models.query import QuerySet

from books.models import Book


def get_books() -> QuerySet[Book]:
    """
    Return all objects of Book model.
    """
    books = Book.objects.all()

    return books
    

ошибка утверждения

AssertionError: <QuerySet [<Book: test_book>]> != <QuerySet [<Book: test_book>]>

Чтобы проверить, что два набора запросов возвращают одни и те же объекты, но не обязательно в одном и том же порядке (конечно, при условии, что они запрашивают одну и ту же базовую модель):

qs1  = Book.objects.all()
qs2 = get_books()
pk1 = qs1.values_list( 'pk', flat=True)
pk2 = q2s.values_list( 'pk', flat=True)

self.assertEqual ( set(pk1), set(pk2) )

Это создает достаточно полезное сообщение, когда тест проваливается. Вы получаете информацию о pks, которые находятся в одном и не находятся в другом, а не просто сообщение "не равно".

Думаю, если вы используете list() вместо set(), вы сможете проверить, что оба возвращают одни и те же объекты в одном и том же порядке.

Вы можете использовать утверждение TransactionTestCase.assertQuerysetEqual из класса TestCase Django. Посмотрите документацию здесь.

В вашем случае:

    # …

    def test_get_books(self):
         self.assertQuerysetEqual(get_books(), Book.objects.all())
Вернуться на верх