#30101: Recommended middleware syntax fails for some testing cases (when not using Client) -------------------------------------+------------------------------------- Reporter: tdiam | Owner: nobody Type: | Status: new Uncategorized | Component: | Version: 2.1 Documentation | Keywords: middleware, unit Severity: Normal | test, requestfactory, request, Triage Stage: | layering Unreviewed | Has patch: 1 Needs documentation: 0 | Needs tests: 0 Patch needs improvement: 0 | Easy pickings: 1 UI/UX: 0 | -------------------------------------+------------------------------------- It is common for developers to prefer RequestFactory over Client in unit testing, or any similar module that mocks requests without processing the URLs or applying the enabled middleware. So, when a unit test needs to test a view while using a middleware, the easiest way to do so is:
{{{ #!python from django.test import RequestFactory from .views import MyView from .middleware import MyMiddleware request = RequestFactory().get('/') view = MyMiddleware(MyView) response = view(request) }}} Also, it may be needed to test views that accept arguments (e.g. captured URL parameters), which would probably look like this: {{{ #!python request = RequestFactory().get('/articles/4/') response = MyView(request, pk=4) }}} The problem arises when we both use test views that accept parameters and a custom middleware. The current documentation offers examples for writing such a middleware: {{{ #!python def MyMiddleware(get_response): # One-time configuration and initialization. def middleware(request): # Code to be executed for each request before # the view (and later middleware) are called. response = get_response(request) # Code to be executed for each request/response after # the view is called. return response return middleware }}} Given the above tests, one would expect this one to work as well as expected: {{{ #!python request = RequestFactory().get('/articles/4/') view = MyMiddleware(MyView) response = view(request, pk=4) }}} However this is not the case, since the `middleware` function expects only a single positional argument and not the keyword argument `pk`, thus raising a TypeError. The attached files recommend a more flexible (albeit less simple) syntax and data flow for custom middleware that would prevent inexperienced developers from getting stuck here. -- Ticket URL: <https://code.djangoproject.com/ticket/30101> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To post to this group, send email to django-updates@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/048.3920e5559558e1cd180a3c54621ad824%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.