【问题标题】:django:: invoking middleware in testsdjango:: 在测试中调用中间件
【发布时间】:2011-05-17 16:15:57
【问题描述】:

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

确实应该有一个函数来接收请求,依次通过所有中间件运行请求,然后发出最终请求(就像传递给视图时一样)。有这样的功能吗?

我可以手动调用中间件函数,但这似乎是一个 hack。如果被测中间件依赖于另一个中间件怎么办?我会遇到“中间件地狱”。

中间件功能:

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

这是我要测试的功能:

def getBaz(request):
    if request.foo == True:
        return something()
    else:
        return somethingElse()

如何测试getBaz

示例>

我可以手动运行中间件:

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

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

    value = getBaz(request)
    assertEqual( value, expected )

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

/可能性>

【问题讨论】:

    标签: django testing django-testing


    【解决方案1】:

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

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

    至于中间件依赖,你可以考虑模拟那个中间件。

    【讨论】:

    • 我认为这还不够。使用 django 客户端会给我一个响应。但我该怎么办?我不想对响应做任何事情。相反,我有一个将自身附加到 request 的方法。当 django 客户端将 response 交给我时,我不再有权访问该请求(它有一个从中间件附加到它的方法)。
    • 测试客户端返回的响应确实可以访问请求。见docs.djangoproject.com/en/1.2/topics/testing/…
    【解决方案2】:

    在我的脑海中(我现在无法测试这个想法,但我遇到了和你一样的问题):它是否是一个解决方案,包括一个只需要返回请求变量的上下文处理器由中间件组件插入?

    【讨论】:

    • 我刚刚试过了,确实很好用。它感觉不对,但我现在可以了。
    猜你喜欢
    • 1970-01-01
    • 2013-08-04
    • 2019-02-12
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    相关资源
    最近更新 更多