繁体   English   中英

在 Django 中使用 unittest 对 REST API 进行功能测试

[英]Feature-testing a REST API with unittest in Django

在我们的 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.pyurls.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM