Допустим, у меня есть модель CustomerProfile
class CustomerProfile(models.Model):
billing_profile = models.ForeignKey(...)
и когда я запускаю assertEqual
на 2 несохраненных объектах, он поднимает AssertionError
self.assertEqual(
CustomerProfile(billing_profile=default_profile),
CustomerProfile(billing_profile=default_profile)
)
Выдает следующую ошибку:
AssertionError: <CustomerProfile: Full Charge None> != <CustomerProfile: Full Charge None>
Я не понимаю, почему, потому что идентификатор экземпляра не был бы заполнен, поскольку он не был сохранен.
В assertEqual
нет специальной поддержки для сравнения моделей Django.
Если модели не были сохранены (т. е. не имеют первичного ключа), то они сравнивают по идентичности (CPython: ячейка памяти), которые всегда будут разными для двух отдельных несохраненных экземпляров модели, даже если все поля одинаковы.
Чтобы сравнить несохраненные экземпляры модели на основе содержимого, вам потребуется вручную проверить, совпадают ли данные во всех соответствующих полях. У стороннего testfixtures
есть помощник для этого: см. django_compare
.
Потому что списки не сравниваются по идентичности. Они реализуют метод __eq__
для сравнения по значению.
Ясно, спасибо, что бы вы порекомендовали протестировать 2 разных несохраненных объекта модели?
Убедитесь, что все соответствующие данные во всех их полях равны.
Этот ответ вообще не соответствует действительности. Существует довольно сложный __eq__
метод для моделей Django, который проверяет PK, но возвращается к идентичности, если модели не сохраняются, что здесь и происходит.
@DanielRoseman Спасибо - для несохраненных моделей pk равен None, так что это все еще сравнение идентичности. Но я отредактирую, чтобы не замалчивать детали.
но почему сравнение двух разных списков работает?
self.assertEqual(['1'], ['1])
Я проверил, что у обоих разные идентификаторы.