簡體   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