Opened 15 years ago
Closed 15 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 , 15 years ago
| Summary: | test.client.RequestFactory doesn't support sessions or cookies → test.client.RequestFactory doesn't support sessions | 
|---|
- deleted wrong comment -
comment:2 by , 15 years ago
ignore the part about request.cookies, obviously that's supposed to be request.COOKIES which works fine.
comment:3 by , 15 years ago
| Cc: | added | 
|---|
comment:4 by , 15 years ago
| Component: | Uncategorized → Testing framework | 
|---|---|
| Resolution: | → wontfix | 
| Status: | new → closed | 
| Type: | Uncategorized → New 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).