Python 如何使用Django集成测试内部POST请求?
我有一个使用Django Rest框架的Django项目,它有两个应用程序(Python 如何使用Django集成测试内部POST请求?,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有一个使用Django Rest框架的Django项目,它有两个应用程序(events和logs)和相关端点/events和/logs 客户端可以向/events发布有关事件的一些信息,对这些信息的处理将在logs应用程序模型中记录日志。然后可以使用GET on/logs检索日志 虽然events视图可以直接通过logs视图进行更新,但我希望通过对/logs调用的POST调用来实现这一点,以使接口定义得更明确,并且在需要时更容易拆分为完全独立的服务。POST调用使用请求包处理,如下所示: fr
events
和logs
)和相关端点/events
和/logs
客户端可以向/events
发布有关事件的一些信息,对这些信息的处理将在logs
应用程序模型中记录日志。然后可以使用GET on/logs
检索日志
虽然events视图可以直接通过logs视图进行更新,但我希望通过对/logs
调用的POST调用来实现这一点,以使接口定义得更明确,并且在需要时更容易拆分为完全独立的服务。POST调用使用请求包处理,如下所示:
from rest_framework.views import APIView
import requests
class Events(APIView):
def post(self, request):
# Some event handling code...
# Record log
log_url = request.build_absolute_uri(reverse('logs'))
requests.post(log_url, data=event)
为了测试这一点,我启动服务器并执行以下操作:
- POST/events/(发布一些JSON数据)
- 获取/记录/
在本例中,我看到了GET请求返回的一些日志数据,因此我知道e2e实现是有效的。但是,当我尝试使用django.test.LiveServerTestCase
自动执行此操作时,响应总是空的
from django.test import LiveServerTestCase
from rest_framework.test import RequestsClient
class AppsEndpointTest(LiveServerTestCase):
def test_post_event_retrieve_logs(self):
events_endpoint = self.live_server_url + '/events/'
logs_endpoint = self.live_server_url + '/logs/'
client = RequestsClient()
# POST an application which we know will trigger an event
client.post(events_endpoint, { 'event_code' : 'TEST_EVENT' })
# Check the event is returned
response = client.get(logs_endpoint)
self.assertEqual(response.status_code, 200)
self.assertIn('TEST_EVENT', [log['event_code'] for logs in response.json()])
# Assertion fails, response is empty
我假设对request.build\u absolute\u uri()
的调用是问题的一部分,并且传入的请求没有用于生成URL的正确主机名。当测试用例运行时,我看不到任何服务器日志记录,这就导致了这个阻塞点
为什么在使用LiveServerTestCase
时这不起作用?我被你的解释弄糊涂了。您正在将两个请求(GET和POST)发送到同一个端点(event\u endpoint
),从描述来看,Events ApiView
应该只处理POST
请求对注释的感谢。我已更新代码以向/logs/
端点发出GET请求。这是我的初衷,对我来说是行不通的。啊,好吧。您是否尝试使用任何其他TestCase
服务器?DRF已经修改了Django测试用例的版本,但我猜它们只是在客户端上有所不同。我认为Django测试用例或TransactionTestCase不起作用,因为它们无法启动服务器实例来处理POST请求。我检查了DRF实例(APILiveServerTestCase),这并没有什么区别。正如您所说,我认为它只会更改客户端。感谢您的建议,我传递了参数--liveserver localhost:8081
,并验证了正在使用该参数,然后硬编码视图以使用该参数,但没有成功。在请求中似乎发生了一些不寻常的事情。post(…)
。不执行此语句后面的任何代码。我假设发生了一些错误/异常,但没有从测试运行程序获取任何日志。我想,我得破解调试器了。