我正在学习如何创建api端点,我正在尝试编写一个测试,以查看post请求是否返回200状态代码.我计划编写更多测试,以查看端点是否也返回了所有预期的结果.我一直收到403状态代码,我认为这是因为我需要在post数据中包含一个csrf标记.在django中测试POST端点的好方法是什么?
我的测试:
from django.test import TestCase from app import settings import requests class ProjectEndpoint(TestCase): def post_endpoint(self): data = {'hello':'23'} post_project = requests.post(settings.BASE_URL+'/api/project', params=data) self.assertEqual(post_endpoint.status_code, 200)
这个测试在403!= 200时仍然失败
我认为这是因为视图可以防止csrf攻击,但我真的不确定.欣赏某人的任何洞察力.
实际上,根据https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#testing,django不会强制(默认情况下)使用测试进行csrf检查:
由于需要必须与每个POST请求一起发送的CSRF令牌,CsrfViewMiddleware通常会成为测试视图函数的一大障碍.出于这个原因,Django的测试HTTP客户端已被修改为在请求上设置一个标志,放松中间件和csrf_protect装饰器,以便它们不再拒绝请求.在其他方面(例如发送cookie等),它们的行为相同.
如果由于某种原因,您希望测试客户端执行CSRF检查,则可以创建执行CSRF检查的测试客户端实例:
来自django.test import客户端
csrf_client =客户端(enforce_csrf_checks = True)
但是,这确实需要您使用Django Client vs请求; 据我所知,Django没有模拟/乐器等.请求...所以当你运行单元测试时,你实际上是在击中真正的服务器.
另请注意,您应该将测试函数命名为以test_开头的内容
所以这样的事情(当通过django manage.py test .ProjectEndpoint运行时)
def test_post_endpoint(self): data = {'hello':'23'} c = Client() #above, from django.test import TestCase,Client #optional, but may be necessary for your configuration: c.login("username","password") response = c.post('/api/project',params=data) self.assertEqual(response.status_code, 200)