Как высмеять команду Django, которая вставляет данные в модель django
Я выполняю unittest на команде Django, которая вставляет данные, полученные из ответа API, в таблицу базы данных. Я использую unittest
и mock
, чтобы подражать классу Command и его методу, но я не уверен, правильно ли я это делаю.
Ниже приведен мой код для Command
и test
:
Команда
class Command():
def _insert_data(self, report_data, start_date):
for data in report_data:
self.cursor.execute('''
INSERT IGNORE INTO `report`
(
`start_date`, `value_a`, `value_b`, `value_c`,`value_d`,
)
VALUES
(%s,%s,%s,%s,%s);''',
(
str(start_date).split()[0], data['value_a'], data['value_b'], data['value_c'], data['value_d']
)
)
test_report_data.py
from unittest import mock
from base.test import BaseTestCase
from client.models.intergration import Report
from client.management.commands.update_report import Command as ReportCommand
class CommandTestMixin(BaseTestCase):
def setUp(self):
super().setUp()
self.mock_api_response = {
"metrics": {
"value_a": "123",
"value_b": "123",
"value_c": "1.48",
"value_d": "1.0",
}
}
self.mock_row = Report.objects.create(
date = "2022-06-013"
value_a = "123",
value_b = "123" ,
value_c = "1.48",
value_d = "1.0",
)
def mock_response(self, json_data=None):
mock_resp = mock.Mock()
if json_data:
mock_resp.json = mock.Mock(
return_value = json_data
)
return mock_resp
class TestInsertReportData(CommandTestMixin):
def setUp(self):
super().setUp()
def test_api_data_insert(self):
command = ReportCommand()
command._insert_data = mock.Mock()
mock_resp = self.mock_response(json_data = self.mock_api_response)
command._insert_data.return_value = self.mock_row
command._insert_data(mock_resp, "2022-06-13")
row = Report.objects.first()
self.assertEqual(str(row.start_date), "2022-06-13")
self.assertEqual(row.value_a, "123")
self.assertEqual(row.value_b, "123")
self.assertEqual(row.value_c, "1.48")
self.assertEqual(row.value_d, "1.0")
Когда я запускаю вышеприведенный тест, он проходит успешно. Но я не уверен, что тест работает так, как должен работать, и ничего странного не происходит.
Я не уверен насчет возвращаемого значения command._insert_data.return_value = self.mock_row
, правильно ли это делать или нет? Потому что когда я передаю mock_resp
, который высмеивает ответ API через высмеиваемый метод _insert_data
класса Command
, я должен вставить точно такие же данные в таблицу и при запросе таблицы Report
должен вернуть то же значение, что и mock_resp
.
пожалуйста, исправьте мой тест и скажите, правильно ли я насмехаюсь над этим.