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

时间:2017-01-14 14:17:21

标签: python django django-rest-framework

我有一个Django项目,使用Django Rest Framework和两个应用程序(eventslogs)以及相关的端点/events/logs

客户端可以POST /events一些有关事件的信息,处理此事件将在logs app模型中记录日志。然后可以使用/logs上的GET检索日志。

虽然事件视图可以直接通过日志视图进行更新,但我希望通过对/logs调用的POST调用来实现此目的,以便更好地定义接口,并在需要时更容易拆分为完全独立的服务。使用requests包处理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 / logs /

在这种情况下,我看到从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_absolute_uri()是问题的一部分,并且进来的请求没有正确的主机名来构建URL。在运行测试用例时,我看不到任何服务器日志记录,这导致我进入此阻塞点。

使用LiveServerTestCase时,为什么这不起作用?

0 个答案:

没有答案