Django 测试 - RequestFactory 中的访问会话

use*_*968 2 django django-testing django-tests

我正在RequestFactoryDjango 测试中使用,但找不到访问会话变量的正确方法,并且在尝试self.factory._session["zip_id"]或时出现以下错误 self.factory.session["zip_id"]

======================================================================
ERROR: test_middleware (dj_geo.tests.IPToZipMiddleWareTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\dj_site_test\dj_geo\tests.py", line 36, in test_middleware
    assert self.factory._session["zip_id"] != None
AttributeError: 'RequestFactory' object has no attribute '_session'

----------------------------------------------------------------------



@override_settings(MIDDLEWARE_CLASSES=(
    'dj_geo.middleware.IPToZipMiddleWare'
))
class IPToZipMiddleWareTest(TestCase):

    def test_middleware(self):
        Zipcode.syncdb()
        assert Zipcode.objects.all().count() > 0

        self.factory = RequestFactory()
        self.request = self.factory.get('/', {}, **{'REMOTE_ADDR':'108.31.178.99'})
        assert self.factory._session["zip_id"] != None
        assert self.factory._session["zip_id"] != ""
Run Code Online (Sandbox Code Playgroud)

小智 7

保存会话信息以使用您的中间件请求

from django.contrib.sessions.middleware import SessionMiddleware

request = RequestFactory().get('/')
middleware = SessionMiddleware()
middleware.process_request(request)
request.session.save()
Run Code Online (Sandbox Code Playgroud)

  • 使用此解决方案,我开始在 Django 4.0 上收到 `TypeError: __init__() Missing 1 requiredpositional argument: 'get_response'` 。我通过 `middleware = SessionMiddleware(lambda x: x)` 解决了它,虽然我不知道这是否真的是正确的解决方案。 (4认同)

小智 6

您确实可以使用 SessionMiddleware。但是,与任何中间件一样,它的构造函数需要回调。回调由 Django 运行时提供,以便继续处理中间件链或在链到达末尾时立即执行视图。由于我们对视图执行不感兴趣,对于这种情况,您可以执行以下操作:

from django.contrib.sessions.middleware import SessionMiddleware

request = RequestFactory().get('/')
middleware = SessionMiddleware(lambda x: None)
middleware.process_request(request)
request.session.save()
Run Code Online (Sandbox Code Playgroud)

通过处理请求,会话字段将添加到其中,您可以继续进行测试。


Sar*_*iev -1

你需要Client为此使用而不是RequestFactory

self.factory = Client()
Run Code Online (Sandbox Code Playgroud)