【问题标题】:Django unit testing middleware errorDjango单元测试中间件错误
【发布时间】:2018-03-28 08:04:39
【问题描述】:

这是我的中间件 -

class HeadersControlMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        response = self.get_response(request)

        response['Cache-Control'] = "no-cache"
        # Code to be executed for each request/response after
        # the view is called.

        return response

这是我的单元测试-

class TestHeadersControlMiddleware(MyAPITestCase):

    def dummy_middleware(self):
        response = Response()
        response.status_code = 200
        response.json = {"key1": "value1"}

        return response

    def test_cache_control_header_is_added(self):
        self.middleware = HeadersControlMiddleware(self.dummy_middleware())
        self.request = RequestFactory()
        self.request.META = {
            "REQUEST_METHOD": "POST",
            "HTTP_APP_VERSION": "1.0.0",
            "HTTP_USER_AGENT": "AUTOMATED TEST"
        }
        self.request.path = '/testURL/'
        self.request.session = {}

        response = self.middleware(self.request)

        print(str(response['Cache-Control']))

运行测试时出现以下错误:

File ".../tests/test_headers_control_middleware.py", line 56, in test_cache_control_header_is_added
response = self.middleware(self.request)
File "..../api/headers_control_middleware.py", line 10, in __call__
response = self.get_response(request)
TypeError: 'Response' object is not callable

有什么想法吗?

编辑 - 显然,我在 'dummy_middleware' 中返回了 'Response' 而不是 'response' (感谢@szymon 的注意)。所以我修复了这个问题并更新了当前的错误和问题。

【问题讨论】:

  • 你的代码缩进错误
  • 可以添加完整的回溯吗?

标签: django unit-testing middleware


【解决方案1】:

您的dummy_middleware 方法应将request 作为参数。我会将它移到测试用例之外,这样您就不必担心self

def dummy_middleware(request):
    response = Response()
    response.status_code = 200
    response.json = {"key1": "value1"}
    return response

那么你应该使用dummy_middleware 来初始化中间件,而不是像现在这样使用dummy_middleware()

self.middleware = HeadersControlMiddleware(dummy_middleware)
...
response = self.middleware(self.request)

【讨论】:

  • 嘿@Alasdair,我尝试了你的建议。我得到'get_response()需要1个位置参数,但给出了2个'所以我将它编辑为'HeadersControlMiddleware(get_response())。然后我得到了 'response = self.get_response(request)' 的 'HttpResponse' object is not callable'
  • 糟糕,我在那段代码中打错了字。这是您应该通过的方法 get_response。然后通过response = self.get_response(request) 行在中间件内部调用它。不要通过get_response()
  • 好像我错过了什么。 RequestFactory 似乎没有得到任何参数。
  • 我已经重写了答案以使用您问题中的dummy_middleware。除了您当前调用dummy_middleware() 而不是传递方法之外,我看不到任何问题。
  • 是的!就是这样。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
相关资源
最近更新 更多