django ::在测试中调用中间件

Ale*_*ird 9 testing django django-testing

我有一个中间件函数定义request.foo.我想测试的函数取决于从中间件定义的foo.我如何测试所述功能,因为中间件在测试期间没有运行?

确实应该有一个接收请求的函数,按顺序通过所有中间件运行请求,然后吐出最终请求(就像传递给视图时一样).这样的功能存在吗?

我可以手动调用中间件函数,但这似乎是一个黑客.如果被测试的中间件依赖于另一个中间件怎么办?我会遇到"中间件地狱".

<example>

中间件功能:

class FooMiddleware():
    def process_request(self, request):
        req.foo = True if req.session.get('foo') in [1,2,3,4,5,6,7,8,9,10] else False
Run Code Online (Sandbox Code Playgroud)

这是我要测试的功能:

def getBaz(request):
    if request.foo == True:
        return something()
    else:
        return somethingElse()
Run Code Online (Sandbox Code Playgroud)

我该如何测试getBaz

</ example>

<可能性>

我可以手动运行中间件:

def test_getBaz(self):
    request = HttpRequest('/blarg')
    request.session['foo'] = 2

    middleware = FooMiddleware()
    request = middleware.process_request(request)

    value = getBaz(request)
    assertEqual( value, expected )
Run Code Online (Sandbox Code Playgroud)

但这似乎是一个黑客.如果被测试的中间件依赖于另一个中间件怎么办?

</可能性>

tob*_*ych 3

我已经看过您的“手动”解决方案,但我建议您考虑使用此处描述的测试客户端:

http://docs.djangoproject.com/en/1.2/topics/testing/#testing-tools

至于中间件依赖性,您可能会考虑模拟该中间件。

  • 我认为这还不够。使用 django 客户端给了我一个响应。但我该怎么办呢?我不想对这个回复做任何事。相反,我有一个将自身附加到_request_的方法。当 django 客户端将_response_交给我时,我不再有权访问该请求(该请求具有从中间件附加的方法)。 (2认同)