在不使用Django本身的情况下测试自定义Django中间件

光子灯

我已经用1.10样式编码了自定义Django中间件,类似于:

class MyMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response
        # some initialization stuff here

    def __call__(self, request):
        # Code executed before view functions are called. 
        # Purpose of this middeware is to add new attribute to request

        # In brief:
        request.new_attribute = some_function_returning_some_object()
        response = self.get_response(request)

        # Code to be executed for each request/response after
        # the view is called.

        return response

请注意,该中间件正受到威胁,因为它是一个单独的Python模块,不属于我的项目中的任何特定应用程序,而是驻留在外部并像其他任何软件包一样通过pip安装。它本身不起作用,只有安装在Django应用中才有效。

它工作正常,但是,我想对其进行测试。到目前为止,我所做的是这样的my_tests.py

from my_middleware_module import MyMiddleware
# some @patches
def test_mymiddleware():
    request = Mock()
    assert hasattr(request, 'new_attribute') is False # passes obviously
    # CALL MIDDLEWARE ON REQUEST HERE
    assert hasattr(request, 'new_attribute') is True # I want it to pass

我不知道如何在request变量上调用中间件以对其进行修改。我认为如果使用类似函数的中间件样式会容易得多,但是如果坚持使用现有的东西又应该只编写测试而不修改中间件怎么办?

恩里克·塞兹(Enrique Saez)

问题是您不会通过调用对象的实例来调用MyMiddleware也不通过__call__魔术方法调用的MyMiddleware构造函数。

有很多方法可以测试您描述的行为,我可以想到这一点:

首先,我对您的示例进行了一些修改,使其完全独立:

class MyMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        request.new_attribute = some_function_returning_some_object()
        response = self.get_response(request)
        return response

def some_function_returning_some_object():
    return 'whatever'

接下来,我通过实际创建中间件对象并调用新创建的对象作为函数来创建测试(因此__call__已运行)

from mock import patch, Mock
from middle import MyMiddleware
import unittest


class TestMiddleware(unittest.TestCase):

    @patch('middle.MyMiddleware')
    def test_init(self, my_middleware_mock):
        my_middleware = MyMiddleware('response')
        assert(my_middleware.get_response) == 'response'

    def test_mymiddleware(self):
        request = Mock()
        my_middleware = MyMiddleware(Mock())
        # CALL MIDDLEWARE ON REQUEST HERE
        my_middleware(request)
        assert request.new_attribute == 'whatever'

这里有一些有用的链接:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Django中设置自定义中间件

如何从Django自定义中间件类返回rest_framework.response对象?

Laravel 5.0自定义404不使用中间件

测试自定义Redux中间件

django-为什么此自定义中间件不起作用

在不使用class关键字的情况下创建自定义元素

Django:自定义中间件导致NoneType错误

在OAuthBearer中间件上使用自定义RoleClaimType

在api模式下使用rails 5时如何创建自定义中间件?

如何在不使用generate函数的情况下编写自定义工厂属性

添加自定义中间件

Django中带有排除项的自定义中间件

Django中间件

如何在不使用Vapor中间件的情况下读取参数

Django rest框架自定义Response中间件

单元测试:动作必须是普通对象。使用自定义中间件进行异步操作

根据要求在Django中间件中添加自定义标头

在自定义中间件中测试response.WriteAsync()

Redux中间件问题-错误:操作必须是纯对象。使用自定义中间件进行异步操作

Django自定义中间件request.user始终为AnonymousUser

Django-在某些情况下使用中间件阻止调试数据

仅在某些情况下触发中间件主体

如何在不使用IB的情况下使用自定义UITabBar类创建UITabBarController?

Django,TastyPie,身份验证和自定义中间件令人头疼

是否可以在不使用中间件功能的情况下增强express.js的req和res变量?

Django自定义中间件检查标头令牌。使用有效请求标头令牌的测试仍然失败

在 Laravel 的自定义中间件中使用会话

Django 的自定义身份验证中间件和身份验证后端

如何在不使用中间件的情况下从 require_http_methods 重定向?