【问题标题】:Feature-testing a REST API with unittest in Django在 Django 中使用 unittest 对 REST API 进行功能测试
【发布时间】:2020-09-28 14:09:28
【问题描述】:

在我们的 Django 项目中,我们有一些在 urls.py 中定义的 API 视图,如下所示:

path('api/calendar/calendar_data', calendar_api.serve_data),

而我们的calendar_apiCalendarAPI的一个实例,上面已经实例化了:

from main.calendar_api import CalendarAPI
from caldav import DAVClient
...
calendar_api = CalendarAPI(client=DAVClient(...))

在 CalendarAPI 类中,我们有一个使用 caldav 库从远程 CalDAV 日历中获取数据的方法,如下所示:

class CalendarAPI(ApiEndpoint):
...
  def __init__(self, client):
    self.caldav_client = client

  def _get_event_list(self):
    return self.caldav_client.principal().calendars()[0].events()

我们希望以 _get_event_list 返回预定义数组的方式模拟此方法。

我们的测试用例如下所示:

from unittest.mock import patch
from django.test import SimpleTestCase

class TestCalendar(SimpleTestCase):
  @patch('main.urls.CalendarAPI')
  def test_response_format(self, calendarapi_mock):
    calendarapi_mock._get_event_list.return_value = mocked_calendar_events
    response = self.client.get('/api/calendar/calendar_data', format='json')
    # fails test if response does not match mocked_calendar_events
    self._compareResponse(response, mocked_calendar_events)

无论我们尝试什么,我们都无法让 mocking 起作用。如果有人知道根据模拟在urls.py 中实例化类的更好方法,请告诉我们!

【问题讨论】:

    标签: python django mocking django-unittest


    【解决方案1】:

    这也总是让我着迷。要在CalendarAPI实例 上模拟方法,您需要在模拟的return_value (calendarapi_mock.return_value) 上模拟方法。

    使用calendarapi_mock._get_event_list.return_value,您正在模拟CalendarAPI 上的方法,即CalendarAPI._get_event_list()

    所以不是

    calendarapi_mock._get_event_list.return_value = mocked_calendar_events
    

    使用:

    calendarapi_mock.return_value._get_event_list.return_value = mocked_calendar_events
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多