не подтверждать попытки обновления базы данных во время django pytest - PullRequest
0 голосов
/ 16 февраля 2020

Я пишу тест django и хочу утверждать, что не было попыток обновления базы данных, но я не хочу издеваться над моделями, потому что я все еще использую их для чтения информации из база данных.

Можно ли утверждать, что в базе данных не было попыток обновления? Или, более конкретно, есть ли способ утверждать, что не было никаких новых попыток обновления в конкретной таблице или конкретной строке?

Обычно я мог бы запросить БД после функции, чтобы узнать, было ли обновлено значение, но я хочу защититься даже от попыток обновления. Например, я хочу защититься от вызова кода User.objects.update(age=new_age), когда он должен знать, что user.age уже равно new_age.

1 Ответ

1 голос
/ 17 февраля 2020

Вы можете захватывать запросы во время теста с помощью django.test.utils.CaptureQueriesContext

Пример:

from django.db import connection
from django.test.utils import CaptureQueriesContext

def test_no_db_updates():
    with CaptureQueriesContext(connection) as context:
        do_test()

    for query in context.captured_queries:
        sql = query['sql']
        assert not (sql.startswith('INSERT INTO ') or sql.startswith('UPDATE ')), \
            'The DB was unexpectedly updated:\n' + sql

Если вы хотите проверить заданную таблицу c, подтвердите, что она не запускается с

f'INSERT INTO `{TheModel._meta.db_table}`'

или

f'UPDATE `{TheModel._meta.db_table}`'

...