Python 如何使用Django集成测试内部POST请求?

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

我有一个使用Django Rest框架的Django项目,它有两个应用程序(
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(…)
。不执行此语句后面的任何代码。我假设发生了一些错误/异常,但没有从测试运行程序获取任何日志。我想,我得破解调试器了。