Code

Opened 7 years ago

Closed 4 years ago

Last modified 4 years ago

#3051 closed defect (fixed)

django.test.client.Client() does not set HttpResponse context and template properly

Reported by: anonymous Owned by: adrian
Component: Documentation Version: master
Severity: normal Keywords:
Cc: django@… Triage Stage: Ready for checkin
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: UI/UX:

Description

Using a view function that relies upon render_to_response(template, context), I run a doctest over the view function utilizing the django.test.client.Client class, however when I get my response object back, the context and template attributes are None.

I thought it might be specific to the doctest, however running the test by hand in a python shell yields the same result.

My view:

# URL re is (r'^(?P<mp_slug>\w+)/(?P<product_class_slug_string>[^_][a-zA-Z0-9_/]+)/_(?P<product_slug>\w+)/$', 'product_detail'),
def product_detail(request, mp_slug, product_class_slug_string, product_slug):
  manipulator = marketplace.ShoppingCartItem.AddManipulator()
  mp = get_object_or_404(marketplace.Marketplace, slug__exact=mp_slug)
  product = get_object_or_404(marketplace.Product, slug__exact=product_slug, 
                              product_class__marketplace__id__exact=mp.id)
  product_class_slug_list = product_class_slug_string.split('/')
  assert product.product_class.marketplace == mp
  assert product_class_slug_list == map(lambda pc: pc.slug, product.product_class.get_ancestry())
  product_class = product.product_class
  data_copy = {}
  
  if request.method == 'POST':
    data_copy = request.POST.copy()
    shopping_cart = marketplace.ShoppingCart.objects.get_cart(mp, request.session)
    
    errors = manipulator.get_validation_errors(data_copy)
    if not errors:
      manipulator.do_html2python(data_copy)
      shopping_cart.add_item_to_cart(product, data_copy['quantity'], data_copy['size_option'])
      return HttpResponseRedirect(shopping_cart.get_absolute_url())
  else:
    errors = {}
  form = forms.FormWrapper(manipulator, data_copy, errors)
  return render_to_response('product_detail.djt', {'form': form,
                                                   'marketplace': mp,
                                                   'product': product,
                                                   'product_class': product_class,
                                                   })


>>> from fsforg.marketplace import models as marketplace

>>> from django.test.client import Client
 

>>> mp = marketplace.Marketplace(name='Test MP', slug='test_mp')

>>> mp.save()

>>> stuff = marketplace.ProductClass(name='Stuff', slug='stuff', parent=None, marketplace=mp)

>>> stuff.save()

>>> thing = marketplace.Product(name='Thing', slug='thing', short_desc='Thing', long_desc='Thing',

...                 unit_price=123.45, photo_url='http://www.gnu.org/graphics/gnu-head-banner.png',

...                 product_class=stuff, weight=0.0)

>>> 

>>> thing.save()
>>> thing.get_absolute_url()

'/marketplaces/test_mp/stuff/_thing/'

>>> c = Client()

>>> response = c.get(thing.get_absolute_url())

>>> response.status_code

200

>>> response.context

>>> response.template

Attachments (2)

testing_skipping_manage_py.diff (611 bytes) - added by Rupe 4 years ago.
Added a note about setup_test_environment()
3051_testing.diff (976 bytes) - added by danielr 4 years ago.
Better patch with more explanation and links to reference.

Download all attachments as: .zip

Change History (15)

comment:1 Changed 7 years ago by anonymous

  • Cc django@… added

Sorry -- somehow failed to put my email address....

comment:2 Changed 7 years ago by russellm

  • Resolution set to invalid
  • Status changed from new to closed

The test instrumentation that gathers template/context details is only installed if (1) you run your doctests through manage.py, or (2) you run django.test.utils.setup_test_environment(). Your sample python shell doesn't call the setup method. If you aren't getting the template/context details in a doctest, I'm guessing that you aren't doing (1), either.

I'm marking this as invalid; if you still get this problem when you use manage.py and/or call setup_test_environment(), feel free to reopen the ticket.

comment:3 Changed 5 years ago by adamtwiss

  • Needs documentation set
  • Resolution invalid deleted
  • Status changed from closed to reopened

I've just come across this same problem, and spent an hour or so scratching my head. .As russellm says it is easy to fix by calling django.test.utils.setup_test_environment() first.
However, this is not really mentioned in the documentation at all. The function is mentioned at:

http://docs.findjango.com/topics/testing.html

But it isn't in anyway clear that you have to call it for certain things to work, and none of the example code calls it.

Surely -at the very least, the documentation/examples need to make this clear.

comment:4 Changed 5 years ago by Alex

  • Component changed from Testing framework to Documentation
  • Triage Stage changed from Unreviewed to Accepted

Changed 4 years ago by Rupe

Added a note about setup_test_environment()

comment:5 Changed 4 years ago by Rupe

  • milestone set to 1.2
  • Needs documentation unset

comment:6 Changed 4 years ago by Rupe

  • Has patch set

comment:7 Changed 4 years ago by ramiro

  • Triage Stage changed from Accepted to Ready for checkin

Patch by Rupe also applies to 1.1.X branch with -37 line offset level 2 fuzz.

comment:8 Changed 4 years ago by brosner

  • Patch needs improvement set
  • Triage Stage changed from Ready for checkin to Accepted

I don't feel like this patch is ready. While the section within testing.txt is correct it lacks much context. This patch needs to do a better job of explaining where setup_test_environment is required. Provide reference links for setup_test_environment as well.

comment:9 Changed 4 years ago by russellm

  • milestone 1.2 deleted

Deferring due to the absence of a trunk-ready patch.

Changed 4 years ago by danielr

Better patch with more explanation and links to reference.

comment:10 Changed 4 years ago by danielr

  • Patch needs improvement unset

Patch updated with more explanation and links.

comment:11 Changed 4 years ago by lrekucki

  • Triage Stage changed from Accepted to Ready for checkin

Patch looks good and applies cleanly.

comment:12 Changed 4 years ago by russellm

  • Resolution set to fixed
  • Status changed from reopened to closed

(In [13626]) Fixed #3051 -- Documented the requirements for standalone testing. Thanks to Daniel Roseman for the draft text.

comment:13 Changed 4 years ago by russellm

(In [13627]) [1.2.X] Fixed #3051 -- Documented the requirements for standalone testing. Thanks to Daniel Roseman for the draft text.

Backport of r13626 from trunk.

Add Comment

Modify Ticket

Change Properties
<Author field>
Action
as closed
as The resolution will be set. Next status will be 'closed'
The resolution will be deleted. Next status will be 'new'
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.