Opened 13 years ago

Closed 13 years ago

#15736 closed New feature (wontfix)

test.client.RequestFactory doesn't support sessions

Reported by: Paul Winkler Owned by: nobody
Component: Testing framework Version: 1.3
Severity: Normal Keywords:
Cc: Preston Timmons Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

I have some helper functions called by various views which take a request as an argument.
I would like to be able to unit-test these.
They are not views exposed by a URL, so I can't use self.client.get(...).

RequestFactory().get('') would be an ideal way to do this, except that it blows up any code that expects request.session or request.cookies to exist:

$ django-admin.py shell
>>> r = RequestFactory().get('/foo')
>>> request.session
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'WSGIRequest' object has no attribute 'session'

By contrast, test.client.Client supports sessions just fine.

I was able to get my tests working with this monkeypatch, which just copies the _request implementation
into RequestFactory:

def _session(self):
    """
    Obtains the current session variables.
    """
    if 'django.contrib.sessions' in settings.INSTALLED_APPS:
        engine = import_module(settings.SESSION_ENGINE)
        cookie = self.cookies.get(settings.SESSION_COOKIE_NAME, None)
        if cookie:
            return engine.SessionStore(cookie.value)
    return {}

def request(self, **request):
    "Construct a generic request object."
    req = WSGIRequest(self._base_environ(**request))
    req.session = self._session()
    return req

RequestFactory._session = _session
RequestFactory.request = request

Change History (4)

comment:1 by Paul Winkler, 13 years ago

Summary: test.client.RequestFactory doesn't support sessions or cookiestest.client.RequestFactory doesn't support sessions

oops, forgot this part of the monkeypatch... request.cookies doesn't exist either:

def request(self, request):

"Construct a generic request object."
req = WSGIRequest(self._base_environ(request))
req.session = self._session()
req.cookies = self.cookies
return req

Version 0, edited 13 years ago by Paul Winkler (next)

comment:2 by Paul Winkler, 13 years ago

ignore the part about request.cookies, obviously that's supposed to be request.COOKIES which works fine.

comment:3 by Preston Timmons, 13 years ago

Cc: Preston Timmons added

comment:4 by Carl Meyer, 13 years ago

Component: UncategorizedTesting framework
Resolution: wontfix
Status: newclosed
Type: UncategorizedNew feature

I think this would be the wrong direction for RequestFactory. In real code, a bare request has no session attribute - that's added only by SessionMiddleware, which is part of a contrib app, not even part of the core framework. Your test failure is correctly telling you that your helper function requires a request object that's been annotated with a session attribute, so your test should explicitly do that annotation in the test setup, if it's a unittest and not an end-to-end test that runs the full request-response cycle (including middleware).

Note: See TracTickets for help on using tickets.
Back to Top