特性-在Django中使用单元测试测试REST API



在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)

无论我们做什么,我们都不能让嘲笑发挥作用。如果有人知道在urls.py中实例化类的更好方法,请告诉我们!

这也总是让我着迷。要模拟CalendarAPI实例上的方法,您需要模拟模拟(calendarapi_mock.return_value(的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

最新更新