Почему в тестах Django не добавляются запросы в db.connection.queries? - PullRequest
8 голосов
/ 08 сентября 2010

Я пытаюсь захватить запросы, которые мой код отправляет в базу данных, изучив содержимое 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 ]

8 голосов
/ 08 сентября 2010

Вы должны явно установить 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

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

5 голосов
/ 08 сентября 2010

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

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')
4 голосов
/ 08 сентября 2010

Когда вы запускаете тесты, DEBUG явно устанавливается на False в рамках тестовой среды Django.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...