Django 测试客户端方法覆盖标头

Posted

技术标签:

【中文标题】Django 测试客户端方法覆盖标头【英文标题】:Django Test Client Method Override Header 【发布时间】:2015-11-01 09:13:23 【问题描述】:

我正在尝试在我的视图集上测试我的更新方法。视图集是从 drf 获取的模型视图集。要更新,我需要发送一个 put 请求。由于这并不总是受支持,因此有两种方法可以告诉服务器我正在发出 put 请求,第一种不符合我需要的方法是使用名为 _method 的附加字段来形成并将其设置为 put。由于我需要发布 json 数据,我需要使用第二种方式,它使用 X-HTTP-Method-Override 标头。

要在测试用例中发布我的数据,我使用以下代码:

header = 'X_HTTP_METHOD_OVERRIDE': 'PUT'
response = client.post('/model/1/', content_type='application/json', data=post_data_clean, **header)

但不幸的是,我得到的结果是'detail':'Method POST not allowed.'。我使用插件 (Postman) 测试了服务器的行为,其中我也指定了 X-HTTP-Method-Override 标头。没有引发异常。我现在需要知道如何正确地将标头传递给 django 测试客户端,否则这里的测试会很烦人。

【问题讨论】:

【参考方案1】:

您需要将标题指定为'HTTP_X_HTTP_METHOD_OVERRIDE' 而不是'X_HTTP_METHOD_OVERRIDE',即在标题的开头添加HTTP_

header = 'HTTP_X_HTTP_METHOD_OVERRIDE': 'PUT'
response = client.post('/model/1/', content_type='application/json', data=post_data_clean, **header)

来自Django documentation:

请求中的 HTTP 标头通过转换转换为 META 键 所有字符为大写,用下划线替换任何连字符 并在名称中添加HTTP_ 前缀。因此,例如,标题 称为X-Bender 将映射到METAHTTP_X_BENDER

【讨论】:

为什么 eff 在文档中这么难找到!? @KeatsKelleher - 更大的问题是为什么这是这种行为?无论如何,我在测试中尝试使用 cookie 时遇到了基本相同的问题 - 要传递 cookie,我需要这样做 header = 'HTTP_COOKIE': 'position=44.4444,-77.7777'【参考方案2】:

此外,您可以将标头传递给客户端的构造函数:

from django.test import Client

client = Client(HTTP_USER_AGENT="Mozilla/5.0 ...", HTTP_X_USER_ID="982734")

这样每个请求都将包含默认标头。

PS:此方法对 DRF TestApiClient 和 ApiRequestFactory 有效。

【讨论】:

以上是关于Django 测试客户端方法覆盖标头的主要内容,如果未能解决你的问题,请参考以下文章

Django 中单元测试的覆盖设置无法正常工作

csharp 使用方法覆盖标头将流量路由到控制器操作的方法。

手机客户端应用UI覆盖测试方法总结

覆盖 django 视图的正确方法是啥

覆盖 Django 渲染方法

如何手动覆盖 WCF 客户端发送的 WSA To 标头