gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:05:41 25 4
gpt4 key购买 nike

我已经在 1.10 style 中编写了我的自定义 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 变量上调用中间件来修改它。我认为如果我使用类似函数的中间件样式会容易得多,但是如果我坚持使用现有的东西并且我应该只编写测试而不修改中间件怎么办?

最佳答案

问题是您既没有调用 MyMiddleware 的构造函数,也没有通过调用 MyMiddleware 的实例来调用 __call__ 魔法方法对象。

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

首先,我稍微修改了您的示例以使其自包含:

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'

这里有一些有用的链接:

关于python - 在不使用 Django 本身的情况下测试自定义 Django 中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42983549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com