Почему запросы не добавляются в БД Django.соединение.запросы в тестах?

Я пытаюсь захватить запросы, которые мой код отправляет в базу данных, изучая содержимое django.db.connection.queries. По какой-то причине после того, как все автоматически созданные запросы установки регистрируются, дальнейшие запросы не регистрируются из моего собственного кода. В следующем тестовом примере показано поведение.

from django.test import TestCase
from django.db import reset_queries, connection
from django.contrib.auth.models import User
from django.conf import settings

class Test1(TestCase):
    def setUp(self):
        settings.DEBUG = True

    def test1(self):
        self.assert_(settings.DEBUG, 'DEBUG is False')
        reset_queries() #clears out all the setup queries
        User.objects.all()
        self.assert_(connection.queries, 'No queries')

и вот результаты его запуска:

Traceback (most recent call last):
  File "/Users/jacob/foo/bar_project/baz_application/tests.py", line 246, in test1
    self.assert_(connection.queries)
AssertionError: No queries

кто-нибудь сможет пролить свет на это? Спасибо.

3 ответов


вы не увидите никаких запросов после выполнения User.objects.all(). Этого и следовало ожидать. Причина? Объекты QuerySet являются лень. Если вы ничего не сделаете с queryset, запрос не будет запущен. Чтобы проверить эту гипотезу, попробуйте следующее И посмотрите, проходит ли тест.

class Test1(TestCase):
    def setUp(self):
        settings.DEBUG = True

    def test1(self):
        self.assert_(settings.DEBUG, 'DEBUG is False')
        reset_queries() #clears out all the setup queries
        print User.objects.all() # <============= Printing the queryset.
        self.assert_(connection.queries, 'No queries')

вы должны явно установить DEBUG. Например, в разделе пример использования для эти тесты в документации django:

# Set up.
# The test runner sets settings.DEBUG to False, but we want to gather queries
# so we'll set it to True here and reset it at the end of the test suite.
>>> from django.conf import settings
>>> settings.DEBUG = True

UPDATE: я могу что-то пропустить, но делать это в каждом тесте обязательно должно исправить проблему. Взгляните на DjangoTestSuiteRunner -- похоже, что DEBUG имеет значение False в setup_test_environment, которая называется run_tests, который продолжает создавать экземпляр a DjangoTestRunner и назвать его run method. Так что тебе придется все отменить. это-на основе быстрого сканирования код, это может быть достаточно, чтобы сделать это в ваш setup метод.


при выполнении тестов DEBUG установлено значение False явно С помощью тестовой платформы Django.