Ответ
Чтобы убедиться, что значение поля изменилось именно в базе данных, а не только в памяти объекта, необходимо после операции сохранения заново получить данные из БД и выполнить проверку.
В Django
Самый идиоматичный способ — использовать метод refresh_from_db().
# models.py
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=100)
is_active = models.BooleanField(default=True)
# tests.py
import pytest
@pytest.mark.django_db
def test_product_deactivation():
# Arrange: создаем объект
product = Product.objects.create(name='Laptop', is_active=True)
# Act: изменяем поле и сохраняем
product.is_active = False
product.save()
# Assert: обновляем объект из БД и проверяем значение
product.refresh_from_db()
assert product.is_active is False
Альтернатива — получить объект заново по его первичному ключу:
# ... (Arrange и Act как выше)
# Assert
updated_product = Product.objects.get(pk=product.pk)
assert updated_product.is_active is False
В SQLAlchemy
Аналогичную функциональность выполняет session.refresh().
from sqlalchemy.orm import Session
def test_user_email_change(session: Session):
# Arrange
user = User(email='old@example.com')
session.add(user)
session.commit()
# Act
user.email = 'new@example.com'
session.commit()
# Assert: обновляем состояние объекта из сессии
session.refresh(user)
assert user.email == 'new@example.com'
❌ Частая ошибка — проверять состояние объекта в памяти без его обновления из БД. Такой тест не гарантирует, что данные были корректно сохранены.