如何对“新风格”Django 中间件进行单元测试

2023-12-30

我正在学习如何对 Django 中间件进行单元测试。

在“旧式”中间件中,使用以下命令加载中间件非常容易process_request()测试结果。例如。

def test_session(self):
    request = self.factory.get('/')
    session_middleware = SessionMiddleware()
    session_middleware.process_request(request)
    // Do stuff

然而,在“新风格”中,这并不存在。例如,我将如何测试以下示例Django 文档 https://docs.djangoproject.com/en/3.0/topics/i18n/timezones/#selecting-the-current-time-zone提供?

class TimezoneMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        tzname = request.session.get('django_timezone')
        if tzname:
            timezone.activate(pytz.timezone(tzname))
        else:
            timezone.deactivate()
        return self.get_response(request)

Using TimezoneMiddleware(request)将调用__init__但不是__call__?


正如你所看到的,中间件简单地实现了一个__call__魔法方法。这意味着该类的实例是callable.

旧式中间件和新式中间件之间的区别在于,新中间件只是一个返回可调用对象的可调用对象 - 首先您使用get_response回调,然后使用实际请求调用返回的可调用对象。get_response是由 Django 本身提供/注入的可调用函数,它是一个用于返回视图响应或链中下一个中间件的函数。

所以,为了测试你的SessionMiddleware,您可以执行以下操作:

import mock

def test_middleware(self):
    get_response = mock.MagicMock()
    request = self.factory.get('/')

    middleware = SessionMiddleware(get_response)
    response = middleware(request)

    # ensure get_response has been returned 
    # (or not, if your middleware does something else)
    self.assertEqual(get_response.return_value, response)
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对“新风格”Django 中间件进行单元测试 的相关文章

随机推荐

  • Rust 中的严格别名?

    我的理解是 由于所谓的 严格别名规则 以下代码在 C 中具有未定义的行为 include
  • C++ 中条件变量的常见用途是什么?

    我正在尝试了解条件变量 我想知道使用条件变量的常见情况有哪些 一个示例是在阻塞队列中 其中有两个线程访问队列 生产者线程将一个项目推入队列 而消费者线程从队列中弹出一个项目 如果队列为空 则消费者线程将等待 直到生产者线程发送信号 还有哪些
  • 如何在Python中获取方法名称

    我一直在尝试获取此方法中的方法名称 我在堆栈上发现了关于获取名称的类似问题function https stackoverflow com questions 251464 how to get a function name as a s
  • StringBuilder 附加 vs +

    这两行有什么区别 stringBuilder append Text counter more text stringBuilder append Text append counter append more text 假设 counte
  • 我无法从 vscode 访问 github 存储库

    我是 Git 新手 我尝试将其与 VSCode 集成 但出现此错误 git clone https github com vijaypatneedi DS git f VS Code DSA DS Cloning into f VS Cod
  • 如何告诉 PyTorch 不使用 GPU?

    我想在 CPU 和 GPU 之间进行一些时序比较以及一些分析 并且想知道是否有办法区分pytorch questions tagged pytorch不使用GPU而只使用CPU 我意识到我可以安装另一个仅 CPUpytorch questi
  • Django 模板/视图与轮播的问题

    好的 交易是这样的 这就是我目前正在做的事情 看到顶部的两个箭头了吗 这就是图片轮播应该在的地方 然而 这个轮播中没有图片 也就是说 直到我单击 上传 按钮 所以 我的目标是在我点击 上传 按钮之前让图片出现在第一页上 我该如何解决这个问题
  • mongo dbname --eval 'db.collection.find()' 不起作用

    为什么这有效 mongo dbname MongoDB shell version 1 8 3 connecting to nextmuni staging gt db collection find foo bar gt bye 虽然这不
  • --disable-web-security 在 Chrome 中工作吗?

    我正在尝试做一个简单的测试 而不更改任何涉及的服务器端代码跨域 https developer mozilla org en US docs Web HTTP CORS AJAX调用 https www w3schools com xml
  • 如何使用cached_network_image预加载图像?

    我刚刚实现了 Flutter包cached network image我想知道如何预加载图像 以便稍后可以立即使用它们 我从我们的服务器检索稍后将使用的所有图像网址 我已经定义了自定义缓存管理器 getter class LocalCach
  • 如何在 Linux 中针对分段错误生成核心转储?

    我的 Linux 中有一个进程出现分段错误 我怎样才能告诉它在失败时生成核心转储 这取决于您使用的 shell 如果您使用的是 bash 则 ulimit 命令控制与程序执行相关的多个设置 例如是否应该转储核心 如果您输入 ulimit c
  • 仅当属性为 null 时,如何从 lombok 构建器中排除该属性

    我有一个用户模型类 如下所示 JsonSerialize Getter Setter FieldDefaults level AccessLevel PRIVATE Builder public class User Default Str
  • 基于 Python 中较小的数据集生成较大的综合数据集

    我有一个包含 21000 行 数据样本 和 102 列 特征 的数据集 我希望根据当前数据集生成一个更大的合成数据集 例如 100000 行 这样我就可以将其用于机器学习目的 我在这篇文章中提到了 Prashant 的答案https sta
  • 替换“/”之前的任何字符串,PHP

    我想替换 之前的任何字符串 无论字符串长度如何 谢谢 让 一种方式 假设您想更改第一个 之前的字符串 str anystring the rest blah s explode str s 0 new string print r impl
  • 谷歌浏览器本地存储保存在哪里?

    某些网站显示正在使用本地存储 在 Google Chrome 中 CTRL I 资源选项卡 本地存储 例如 StackOverflow 有一个 login prefs 键和我的默认登录提供程序 所以据我所知它是一个 json 对象 这些数据
  • Spring embeddeb 数据库表已存在错误

    我正在尝试使用嵌入式数据库运行 Spring Boot 应用程序 在 bean 初始化期间 由于某种原因 我的表创建脚本被调用两次 第二次调用失败 并出现 表已存在 错误 下面是我的代码 可能是什么问题 Configuration publ
  • MatLab - 将函数应用于矩阵中的每一行

    我有一个矩阵 行数为 4 个整数 列数未指定 取决于文本文件 我想独立地将函数应用于矩阵的每一行 该函数有 4 个输入和 2 个输出 我尝试使用 arrayfun 函数来执行此操作 但每当我调用该函数时 都会收到一条错误消息 输入参数不足
  • 如何在木偶上使用参数化正则表达式(例如/${user}/)进行测试?

    我需要获取用户的主目录 我决定通过解析 getent passwd 字符串来获取它 这是一个自定义事实构建为 内容的串联 etc passwd 并借助正则表达式提取相关信息 当我测试 getent带有固定字符串 adam 提取工程 if g
  • 如何在C#中使用Either类型?

    佐兰 霍瓦特 https www pluralsight com authors zoran horvat提议使用Either类型以避免空检查和不要忘记处理问题在执行操作期间 Either在函数式编程中很常见 为了说明其用法 Zoran 展
  • 如何对“新风格”Django 中间件进行单元测试

    我正在学习如何对 Django 中间件进行单元测试 在 旧式 中间件中 使用以下命令加载中间件非常容易process request 测试结果 例如 def test session self request self factory ge