我怎样才能用Django test Client提交POST请求,这样我就可以在请求中包含表单数据了?特别是,我希望有这样的东西(灵感来自于我应该如何在Django中为表单编写测试?):
from django.tests import TestCase
class MyTests(TestCase):
def test_forms(self):
response = self.client.post("/my/form/", {'something':'something'})
我的端点/my/form有一些内部逻辑来处理“something”。问题是当我稍后尝试访问request.POST.get('something')时,我无法获得任何东西。我找到了一个解决方案,所以我在下面分享。
4条答案
按热度按时间soat7uwm1#
关键是在client的post方法中添加content_type,并对数据进行urlencode编码。
希望这对某人有帮助!
avwztpqn2#
如果你使用client在旧版django上发送字典,你必须定义content_type ='application/json',因为它的内部转换无法处理字典,你还需要使用 json.dumps 方法像blob一样发送字典。
jgzswidk3#
如果您将content_type作为
application/json
提供,则如果数据是dict、list或tuple,则使用json.dumps()
进行序列化。默认情况下使用DjangoJSONEncoder
执行序列化,并且可以通过向Client
提供json_encoder
参数来覆盖序列化。put()、patch()和delete()请求也会发生此序列化。bn31dyow4#
我尝试过在Django中使用Client()对POST请求进行单元测试,但是我无法让它工作(即使使用上面指定的方法)。所以这里有一个专门针对POST请求的替代方法(使用HttpRequest()):
将**view_function_name()**替换为实际的函数名。此函数向正在测试的视图发送POST请求,其中包含表单字段“something”及其对应的值。Assert语句将完全取决于测试函数的实用性。以下是一些可以使用的Assert:
self.assertEquals(response.status_code, 302)
:当表单在提交POST请求后重定向时(302是重定向的状态码),进行此Assert。self.assertNotIn(b'Form error message', response.content)
:将“Form error message”替换为通过请求发送不正确详细信息时表单生成的错误消息。如果测试数据不正确,则测试将失败(文本将转换为字节,因为HttpResponse().content也是bytes对象)。如果view函数也使用Django Message框架来显示表单错误消息,请在response之前包含以下内容:
如果视图函数使用会话,请在响应之前包含此内容:
在发出请求之前,请记住应用程序可能使用的任何上下文处理器的用法。
我个人觉得这个方法更直观(和功能性)。这似乎涵盖了所有可能的关于HTTP请求和表单的测试用例。
我还想建议将每个单元测试用例分解为单独的组件,以增加覆盖率并发现代码中潜在的bug,而不是将所有用例集中在一个test_forms()中。
Harry J.W. Percival在他的书Test-Driven Development with Python中提到了这项技术。