Fixed #14774 -- the test client and assertNumQueries didn't work well together. Thanks to Jonas Obrist for the initial patch.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@15251 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
53dac996ef
commit
8308ad4f05
|
@ -6,8 +6,10 @@ from xml.dom.minidom import parseString, Node
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core import mail
|
from django.core import mail
|
||||||
from django.core.management import call_command
|
from django.core.management import call_command
|
||||||
|
from django.core.signals import request_started
|
||||||
from django.core.urlresolvers import clear_url_caches
|
from django.core.urlresolvers import clear_url_caches
|
||||||
from django.db import transaction, connection, connections, DEFAULT_DB_ALIAS
|
from django.db import (transaction, connection, connections, DEFAULT_DB_ALIAS,
|
||||||
|
reset_queries)
|
||||||
from django.http import QueryDict
|
from django.http import QueryDict
|
||||||
from django.test import _doctest as doctest
|
from django.test import _doctest as doctest
|
||||||
from django.test.client import Client
|
from django.test.client import Client
|
||||||
|
@ -220,10 +222,12 @@ class _AssertNumQueriesContext(object):
|
||||||
self.old_debug_cursor = self.connection.use_debug_cursor
|
self.old_debug_cursor = self.connection.use_debug_cursor
|
||||||
self.connection.use_debug_cursor = True
|
self.connection.use_debug_cursor = True
|
||||||
self.starting_queries = len(self.connection.queries)
|
self.starting_queries = len(self.connection.queries)
|
||||||
|
request_started.disconnect(reset_queries)
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def __exit__(self, exc_type, exc_value, traceback):
|
def __exit__(self, exc_type, exc_value, traceback):
|
||||||
self.connection.use_debug_cursor = self.old_debug_cursor
|
self.connection.use_debug_cursor = self.old_debug_cursor
|
||||||
|
request_started.connect(reset_queries)
|
||||||
if exc_type is not None:
|
if exc_type is not None:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
|
@ -2,20 +2,13 @@ import sys
|
||||||
|
|
||||||
from django.test import TestCase, skipUnlessDBFeature, skipIfDBFeature
|
from django.test import TestCase, skipUnlessDBFeature, skipIfDBFeature
|
||||||
|
|
||||||
|
from models import Person
|
||||||
|
|
||||||
if sys.version_info >= (2, 5):
|
if sys.version_info >= (2, 5):
|
||||||
from tests_25 import AssertNumQueriesTests
|
from tests_25 import AssertNumQueriesContextManagerTests
|
||||||
|
|
||||||
|
|
||||||
class SkippingTestCase(TestCase):
|
class SkippingTestCase(TestCase):
|
||||||
def test_assert_num_queries(self):
|
|
||||||
def test_func():
|
|
||||||
raise ValueError
|
|
||||||
|
|
||||||
self.assertRaises(ValueError,
|
|
||||||
self.assertNumQueries, 2, test_func
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_skip_unless_db_feature(self):
|
def test_skip_unless_db_feature(self):
|
||||||
"A test that might be skipped is actually called."
|
"A test that might be skipped is actually called."
|
||||||
# Total hack, but it works, just want an attribute that's always true.
|
# Total hack, but it works, just want an attribute that's always true.
|
||||||
|
@ -26,8 +19,37 @@ class SkippingTestCase(TestCase):
|
||||||
self.assertRaises(ValueError, test_func)
|
self.assertRaises(ValueError, test_func)
|
||||||
|
|
||||||
|
|
||||||
class SaveRestoreWarningState(TestCase):
|
class AssertNumQueriesTests(TestCase):
|
||||||
|
def test_assert_num_queries(self):
|
||||||
|
def test_func():
|
||||||
|
raise ValueError
|
||||||
|
|
||||||
|
self.assertRaises(ValueError,
|
||||||
|
self.assertNumQueries, 2, test_func
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_assert_num_queries_with_client(self):
|
||||||
|
person = Person.objects.create(name='test')
|
||||||
|
|
||||||
|
self.assertNumQueries(
|
||||||
|
1,
|
||||||
|
self.client.get,
|
||||||
|
"/test_utils/get_person/%s/" % person.pk
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertNumQueries(
|
||||||
|
1,
|
||||||
|
self.client.get,
|
||||||
|
"/test_utils/get_person/%s/" % person.pk
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_func():
|
||||||
|
self.client.get("/test_utils/get_person/%s/" % person.pk)
|
||||||
|
self.client.get("/test_utils/get_person/%s/" % person.pk)
|
||||||
|
self.assertNumQueries(2, test_func)
|
||||||
|
|
||||||
|
|
||||||
|
class SaveRestoreWarningState(TestCase):
|
||||||
def test_save_restore_warnings_state(self):
|
def test_save_restore_warnings_state(self):
|
||||||
"""
|
"""
|
||||||
Ensure save_warnings_state/restore_warnings_state work correctly.
|
Ensure save_warnings_state/restore_warnings_state work correctly.
|
||||||
|
|
|
@ -5,7 +5,7 @@ from django.test import TestCase
|
||||||
from models import Person
|
from models import Person
|
||||||
|
|
||||||
|
|
||||||
class AssertNumQueriesTests(TestCase):
|
class AssertNumQueriesContextManagerTests(TestCase):
|
||||||
def test_simple(self):
|
def test_simple(self):
|
||||||
with self.assertNumQueries(0):
|
with self.assertNumQueries(0):
|
||||||
pass
|
pass
|
||||||
|
@ -26,3 +26,16 @@ class AssertNumQueriesTests(TestCase):
|
||||||
with self.assertRaises(TypeError):
|
with self.assertRaises(TypeError):
|
||||||
with self.assertNumQueries(4000):
|
with self.assertNumQueries(4000):
|
||||||
raise TypeError
|
raise TypeError
|
||||||
|
|
||||||
|
def test_with_client(self):
|
||||||
|
person = Person.objects.create(name="test")
|
||||||
|
|
||||||
|
with self.assertNumQueries(1):
|
||||||
|
self.client.get("/test_utils/get_person/%s/" % person.pk)
|
||||||
|
|
||||||
|
with self.assertNumQueries(1):
|
||||||
|
self.client.get("/test_utils/get_person/%s/" % person.pk)
|
||||||
|
|
||||||
|
with self.assertNumQueries(2):
|
||||||
|
self.client.get("/test_utils/get_person/%s/" % person.pk)
|
||||||
|
self.client.get("/test_utils/get_person/%s/" % person.pk)
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
from django.conf.urls.defaults import patterns
|
||||||
|
|
||||||
|
import views
|
||||||
|
|
||||||
|
|
||||||
|
urlpatterns = patterns('',
|
||||||
|
(r'^get_person/(\d+)/$', views.get_person),
|
||||||
|
)
|
|
@ -0,0 +1,7 @@
|
||||||
|
from django.http import HttpResponse
|
||||||
|
from django.shortcuts import get_object_or_404
|
||||||
|
from models import Person
|
||||||
|
|
||||||
|
def get_person(request, pk):
|
||||||
|
person = get_object_or_404(Person, pk=pk)
|
||||||
|
return HttpResponse(person.name)
|
|
@ -1,5 +1,6 @@
|
||||||
from django.conf.urls.defaults import *
|
from django.conf.urls.defaults import *
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = patterns('',
|
urlpatterns = patterns('',
|
||||||
# test_client modeltest urls
|
# test_client modeltest urls
|
||||||
(r'^test_client/', include('modeltests.test_client.urls')),
|
(r'^test_client/', include('modeltests.test_client.urls')),
|
||||||
|
@ -41,4 +42,7 @@ urlpatterns = patterns('',
|
||||||
|
|
||||||
# special headers views
|
# special headers views
|
||||||
(r'special_headers/', include('regressiontests.special_headers.urls')),
|
(r'special_headers/', include('regressiontests.special_headers.urls')),
|
||||||
|
|
||||||
|
# test util views
|
||||||
|
(r'test_utils/', include('regressiontests.test_utils.urls')),
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue