Index: django/test/testcases.py
===================================================================
--- django/test/testcases.py	(revision 6023)
+++ django/test/testcases.py	(working copy)
@@ -6,6 +6,7 @@
 from django.db.models import get_apps
 from django.test import _doctest as doctest
 from django.test.client import Client
+from django.conf import settings
 
 normalize_long_ints = lambda s: re.sub(r'(?<![\w])(\d+)L(?![\w])', '\\1', s)
 
@@ -59,7 +60,7 @@
         self.client = Client()
         self._pre_setup()
         super(TestCase, self).__call__(result)
-
+    
     def assertRedirects(self, response, expected_path, status_code=302, target_status_code=200):
         """Assert that a response redirected to a specific URL, and that the
         redirect URL can be loaded.
@@ -154,3 +155,33 @@
             self.assertNotEqual(template_name, response.template.name,
                 u"Template '%s' was used unexpectedly in rendering the response" % template_name)
 
+    def assertValidResponse(self, response, content_type="text/html"):
+        "Assert that the response has a 200 status code and is of the proper content type."
+        self.assertEqual(200, response.status_code,
+            u"Expected a 200 status code, but %s was returned" % response.status_code)
+        
+        expected_content_type = "%s; charset=%s" % (content_type, settings.DEFAULT_CHARSET)
+        actual_content_type = response.headers['Content-Type']
+        self.assertEqual(expected_content_type, actual_content_type,
+            u"Expected a Content-Type of %s, but %s was returned" % (expected_content_type, actual_content_type))
+
+    def check_response(self, response, template_name=None, text_checks=[], content_type="text/html"):
+        """Checks that the response returns a 200, the right content_type,
+           uses the right template, then checks the text of the response.
+           
+           Example:
+           def test_my_view(self):
+               text_checks = (
+                    ("List of hello objects", None),
+                    ("Hello Object", 3),
+               )
+               self.check_response('/hello/world/', 'hello/hello_list.html', text_checks) #Assuming text/html and settings.DEFAULT_CHARSET
+        """
+        self.assertValidResponse(response, content_type)
+        
+        if template_name:
+            self.assertTemplateUsed(response, template_name)
+        
+        for check in text_checks:
+            text, count = check
+            self.assertContains(response, text, count)
\ No newline at end of file
Index: tests/modeltests/test_client/views.py
===================================================================
--- tests/modeltests/test_client/views.py	(revision 6023)
+++ tests/modeltests/test_client/views.py	(working copy)
@@ -6,6 +6,7 @@
 from django.newforms.forms import Form
 from django.newforms import fields
 from django.shortcuts import render_to_response
+from django.conf import settings
 
 def get_view(request):
     "A simple view that expects a GET request, and returns a rendered template"
@@ -14,6 +15,12 @@
     
     return HttpResponse(t.render(c))
 
+def get_xml_view(request):
+    "A simple view that expects a GET request and returns a rendered template with a content type of text/xml"
+    response = get_view(request)
+    response.headers['Content-Type'] = "text/xml; charset=%s" % (settings.DEFAULT_CHARSET)
+    return response
+
 def post_view(request):
     """A view that expects a POST, and returns a different template depending
     on whether any POST data is available
Index: tests/modeltests/test_client/urls.py
===================================================================
--- tests/modeltests/test_client/urls.py	(revision 6023)
+++ tests/modeltests/test_client/urls.py	(working copy)
@@ -4,6 +4,7 @@
 
 urlpatterns = patterns('',
     (r'^get_view/$', views.get_view),
+    (r'^get_xml_view/$', views.get_xml_view),
     (r'^post_view/$', views.post_view),
     (r'^raw_post_view/$', views.raw_post_view),
     (r'^redirect_view/$', views.redirect_view),
Index: tests/regressiontests/test_client_regress/models.py
===================================================================
--- tests/regressiontests/test_client_regress/models.py	(revision 6023)
+++ tests/regressiontests/test_client_regress/models.py	(working copy)
@@ -4,6 +4,7 @@
 """
 from django.test import Client, TestCase
 from django.core import mail
+from django.conf import settings
 import os
 
 class AssertContainsTests(TestCase):
@@ -213,3 +214,39 @@
         }
         response = self.client.post('/test_client_regress/file_upload/', post_data)
         self.assertEqual(response.status_code, 200)
+
+class AssertValidResponseTests(TestCase):
+    def test_html_response(self):
+        response = self.client.get('/test_client/get_view/')
+        self.assertValidResponse(response)
+        
+    def test_xml_response(self):
+        response = self.client.get('/test_client/get_xml_view/')
+        self.assertValidResponse(response, "text/xml")
+        
+    def test_bad_response(self):
+        response = self.client.get('/test_client/bad_view/')
+        try:
+            self.assertValidResponse(response)
+        except AssertionError, e:
+            self.assertEqual(str(e), "Expected a 200 status code, but 404 was returned")
+        
+    def test_bad_content_type(self):
+        response = self.client.get('/test_client/get_view/')
+        try:
+            self.assertValidResponse(response, content_type="text/javascript")
+        except AssertionError, e:
+            charset = settings.DEFAULT_CHARSET
+            self.assertEqual(str(e), "Expected a Content-Type of text/javascript; charset=%s, but text/html; charset=%s was returned" % (charset, charset))
+
+class CheckViewTests(TestCase):
+    def test_simple_response(self):
+        response = self.client.get('/test_client/get_view/')
+        text_checks = (
+            ('This is a test', 1),
+            ('42', 1),
+            ('is', 3),
+            ('This is not a test', 0),
+        )
+        
+        self.check_response(response, template_name='GET Template', text_checks=text_checks)
\ No newline at end of file
