微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Django测试中的响应对象中检查session.modifed = True?

如何解决如何在Django测试中的响应对象中检查session.modifed = True?

[django 1.4,python 2.7]

我们有一个自定义会话引擎,用于将会话存储到redis(与db session引擎几乎相同,只是存储在redis中)。

有些公共端点会在每次调用会话中间件时将会话存储到redis会话(session.modified设置为True),这不是我们的意图。

我正在尝试编写单元测试以检查哪些端点确实生成了会话。

# This endpoint would always save session to redis
def test_endpoint(request,**kwargs):
    request.session['asdfsaf'] = 1
    # Or,request.session.modified = True (Both fine)
    return httplib.OK,"good"

尝试1:

    response = self.client.post(reverse('test_endpoint',kwargs=self.kwargs),data={...})

    print(response.status_code,response.content) # Ok 
    print('am i modified?',self.client.session.modified) # False

    for i in range(10):
        redis = get_redis_instance(db=i)
        print("redis key",i,redis.keys())  # All return empty redis

此单元测试无法检测到通过django会话中间件保存的会话。 可能是由于每次访问此属性都会创建 新的SessionStore https://docs.djangoproject.com/en/2.2/topics/testing/tools/#persistent-state

尝试2:

从SessionMiddlewareTests中汲取灵感:

    request = RequestFactory().post(reverse('test_endpoint',data={...})
    response = HttpResponse('Session test')
    middleware = SessionMiddleware()

    middleware.process_request(request)

    # Handle the response through the middleware
    response = middleware.process_response(request,response)
    print('am i modified',request.session.modified) # False

    for i in range(10):
        redis = get_redis_instance(db=i)
        print("redis key",redis.keys())  # All return empty redis

同样,我无法检测到该端点实际上是在存储要重新分发的会话。

如何以编程方式检查API是否创建了会话? (以某种方式通过设置session.modified标志True来创建它)?

要做的最后一件事是手动测试并亲自检查redis db。 (超过200个公共端点,并且无法防止将来发生类似问题。)

非常感谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。