Как в тесте для ORM проверить, что значение поля в базе данных изменилось

«Как в тесте для ORM проверить, что значение поля в базе данных изменилось» — вопрос из категории Тестирование, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Чтобы убедиться, что значение поля изменилось именно в базе данных, а не только в памяти объекта, необходимо после операции сохранения заново получить данные из БД и выполнить проверку.

В 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'

❌ Частая ошибка — проверять состояние объекта в памяти без его обновления из БД. Такой тест не гарантирует, что данные были корректно сохранены.