2010-09-07 13 views
7

Estoy tratando de capturar las consultas que mi código envía a la base de datos mediante el examen de los contenidos de django.db.connection.queries. Sin embargo, por algún motivo, después de que todas las consultas de configuración generadas automáticamente se registran, no se registran más consultas desde mi propio código. El siguiente caso de prueba demuestra el comportamiento.¿Cómo es que las consultas no se agregan a Db.connection.queries de Django en las pruebas?

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

Y aquí están los resultados de la ejecución que:

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 

qué cualquier persona será capaz de arrojar alguna luz sobre esto? Gracias.

+0

Tuve la posibilidad de aprobar la prueba. Ver mi respuesta –

Respuesta

5

No verá ninguna consulta después de ejecutar User.objects.all(). Esto es de esperar. ¿La razón? Los conjuntos de consultas son perezoso. A menos que haga algo con el queryset NO se activará ninguna consulta. Para verificar esta hipótesis, intente lo siguiente y vea si la prueba pasa.

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') 
+0

Sí. Eres el hombre. Muchas gracias. – Jacob

3

Cuando ejecuta las pruebas DEBUG is set to False explicitly por Django test framework.

+0

Gracias. Es extraño que incluso volver a ponerlo en True en la prueba no parezca cambiar nada. – Jacob

6

Tiene que establecer explícitamente DEBUG. Por ejemplo, véase la sección de ejemplos de uso para these tests en la documentación de 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 

ACTUALIZACIÓN: puedo estar perdiendo algo, pero hacerlo en cada prueba definitivamente debe solucionar el problema. Eche un vistazo al DjangoTestSuiteRunner - parece que DEBUG se establece False en el setup_test_environment, que se llama en run_tests, que va a instanciar un DjangoTestRunner y llama a su run method. Por lo tanto, tendrá que deshacer eso; en base a un escaneo rápido del code, podría ser suficiente hacer esto en su método setup.

+0

Ya lo hice, gracias. Hay aproximadamente 5000 sentencias SQL desde la configuración de la prueba db que se borran con la llamada 'reset_queries()'. ¿Alguna otra idea? – Jacob

+0

Oh, ¿quieres decir en la prueba en sí? – Jacob

+0

@jacob: consulte la actualización. – ars

Cuestiones relacionadas