2010-09-07 9 views
7

Sto tentando di acquisire le query che il mio codice invia al database esaminando il contenuto di django.db.connection.queries. Per qualche motivo, dopo che tutte le query di installazione prodotte automaticamente sono state registrate, non vengono registrate ulteriori query dal mio codice. Il seguente test case dimostra il comportamento.Come mai le query non vengono aggiunte a dba.connection.queries di Django nei test?

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

E qui sono i risultati di eseguirlo:

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 

qualcuno dovrebbe essere in grado di far luce su questo? Grazie.

+0

Sono riuscito a superare il test. Vedi la mia risposta. –

risposta

5

Non è possibile visualizzare alcuna query dopo l'esecuzione di User.objects.all(). Questo è solo da aspettarsi. La ragione? I quadranti sono pigri. A meno che tu non faccia qualcosa con il queryset, NON verrà avviata alcuna query. Per verificare questa ipotesi, provare quanto segue e verificare se il test ha esito positivo.

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ì. Tu sei l'uomo. Grazie mille. – Jacob

3

Quando si eseguono i test DEBUG is set to False explicitly dal framework di prova Django.

+0

Grazie. È strano che persino riportarlo su True nel test non sembra cambiare nulla. – Jacob

6

È necessario impostare in modo esplicito DEBUG. Ad esempio, vedere la sezione utilizzo campione per these tests nella documentazione 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: I può essere manca qualcosa, ma farlo in ogni test deve assolutamente risolvere il problema. Dai uno sguardo allo DjangoTestSuiteRunner - sembra che DEBUG sia impostato su False nel numero setup_test_environment, che viene chiamato in run_tests, che continua per creare un'istanza di DjangoTestRunner e chiama il suo run method. Pertanto, dovrai annullare tale operazione, in base a una scansione rapida di code, potrebbe essere sufficiente farlo nel metodo setup.

+0

Già fatto, grazie. Ci sono circa 5000 istruzioni SQL dalla configurazione del db di test che vengono cancellate dalla chiamata 'reset_queries()'. Altre idee? – Jacob

+0

Oh, vuoi dire nel test stesso ?? – Jacob

+0

@jacob: consultare l'aggiornamento. – ars

Problemi correlati