[英]Feature-testing a REST API with unittest in Django
在我們的 Django 項目中,我們在urls.py
中定義了一些 API 視圖,如下所示:
path('api/calendar/calendar_data', calendar_api.serve_data),
我們的calendar_api
是CalendarAPI
一個實例,上面實例化了:
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
在urls.py
中實例化類的更好方法,請告訴我們!
這也總是讓我着迷。 要在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.