Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed #4901 -- Modified assertContains to provide a default check of …

…'any instances of text in content'. Thanks for the suggestion, nis@superlativ.dk.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@5731 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 56394220d5d4ae443dfc0fb55f677099696a55bf 1 parent bdc5a3e
@freakboy3742 freakboy3742 authored
View
14 django/test/testcases.py
@@ -73,19 +73,23 @@ def assertRedirects(self, response, expected_path, status_code=302, target_statu
"Couldn't retrieve redirection page '%s': response code was %d (expected %d)" %
(path, redirect_response.status_code, target_status_code))
- def assertContains(self, response, text, count=1, status_code=200):
+ def assertContains(self, response, text, count=None, status_code=200):
"""Assert that a response indicates that a page was retreived successfully,
(i.e., the HTTP status code was as expected), and that ``text`` occurs ``count``
- times in the content of the response.
+ times in the content of the response. If ``count`` is None, the count doesn't
+ matter - the assertion is true if the text occurs at least once in the response.
"""
self.assertEqual(response.status_code, status_code,
"Couldn't retrieve page: Response code was %d (expected %d)'" %
(response.status_code, status_code))
real_count = response.content.count(text)
- self.assertEqual(real_count, count,
- "Found %d instances of '%s' in response (expected %d)" % (real_count, text, count))
-
+ if count:
+ self.assertEqual(real_count, count,
+ "Found %d instances of '%s' in response (expected %d)" % (real_count, text, count))
+ else:
+ self.assertTrue(real_count != 0, "Couldn't find '%s' in response" % text)
+
def assertFormError(self, response, form, field, errors):
"Assert that a form used to render the response has a specific field error"
if not response.context:
View
7 docs/testing.txt
@@ -481,10 +481,11 @@ Normal Python unit tests have a wide range of assertions, such as
``django.TestCase`` adds to these, providing some assertions
that can be useful in testing the behavior of web sites.
-``assertContains(response, text, count=1, status_code=200)``
+``assertContains(response, text, count=None, status_code=200)``
Assert that a response indicates that a page could be retrieved and
- produced the nominated status code, and that ``text`` occurs ``count``
- times in the content of the response.
+ produced the nominated status code, and that ``text`` in the content
+ of the response. If ``count`` is provided, ``text`` must occur exactly
+ ``count`` times in the response.
``assertFormError(response, form, field, errors)``
Assert that a field on a form raised the provided list of errors when
View
30 tests/regressiontests/test_client_regress/models.py
@@ -6,6 +6,36 @@
from django.core import mail
import os
+class AssertContainsTests(TestCase):
+ def test_contains(self):
+ "Reponses can be inspected for content, including counting repeated substrings"
+ response = self.client.get('/test_client_regress/no_template_view/')
+
+ self.assertContains(response, 'once')
+ self.assertContains(response, 'once', 1)
+ self.assertContains(response, 'twice')
+ self.assertContains(response, 'twice', 2)
+
+ try:
+ self.assertContains(response, 'once', 2)
+ except AssertionError, e:
+ self.assertEquals(str(e), "Found 1 instances of 'once' in response (expected 2)")
+
+ try:
+ self.assertContains(response, 'twice', 1)
+ except AssertionError, e:
+ self.assertEquals(str(e), "Found 2 instances of 'twice' in response (expected 1)")
+
+ try:
+ self.assertContains(response, 'thrice')
+ except AssertionError, e:
+ self.assertEquals(str(e), "Couldn't find 'thrice' in response")
+
+ try:
+ self.assertContains(response, 'thrice', 3)
+ except AssertionError, e:
+ self.assertEquals(str(e), "Found 0 instances of 'thrice' in response (expected 3)")
+
class AssertTemplateUsedTests(TestCase):
fixtures = ['testdata.json']
View
2  tests/regressiontests/test_client_regress/views.py
@@ -4,7 +4,7 @@
def no_template_view(request):
"A simple view that expects a GET request, and returns a rendered template"
- return HttpResponse("No template used")
+ return HttpResponse("No template used. Sample content: twice once twice. Content ends.")
def file_upload_view(request):
"""
Please sign in to comment.
Something went wrong with that request. Please try again.