Django, Mock сохраняет для себя только аргументы последнего вызова
Использование Django==3.2.15
, mock==3.0.5
, Python ~3.7
Я заметил, что mock не сохраняет все call_args
от различных вызовов, сделанных к нему, и все они с сигнатурой последнего вызова , сделанного к нему.
Мой код:
Это фрагмент, который напоминает место, где будет вызван сервис-макет, вниз по течению.
object_ids
это список целочисленных идентификаторов объектов, которые я посылаю сервису для обработки.
max_allotted_size
- целое число, обозначает "куски", на которые я хочу разделить взаимодействие с сервисом.
message_body
определяется перед циклом и содержит другую информацию, необходимую сервису
from location.of.service import MyService
my_service = MyService()
num_iterations, leftover = divmod(len(object_ids), max_allotted_size)
log_ids = []
for i in range(num_iterations):
message_body['object_ids'] = object_ids[prev:curr]
print(
"iteration: {}, IDS count: {}, IDS: {}".format(
i,
len(object_ids[prev:curr]),
object_ids[prev:curr],
)
)
_, error = my_service.send_payload_to_some_other_service(message_body)
if not error:
log_ids += object_ids[prev:curr]
prev = curr
curr += max_allotted_size
Существует также код, который подхватывает leftover
:
if leftover:
message_body['object_ids'] = object_ids[prev:]
print(
"leftover IDS count: {}, IDS: {}".format(
len(object_ids[prev:]),
object_ids[prev:],
)
)
_, error = my_service.send_payload_to_some_other_service(message_body)
if not error:
log_ids += object_ids[prev:]
Также есть печать в конце , чтобы показать log_ids
собранные с каждой итерацией и остатки:
print("log_ids: {}".format(log_ids))
Это тестовый код (соответствующий код):
from mock import patch
class TestClassName(object):
def setUp(self):
...
@patch('location.of.service.MyService.send_payload_to_some_other_service')
def test_some_test_name(self, mocked_service_method):
# Preparation has been made, there are 28 objects ready for this test
# so the service should be called with the 28 IDs, resulting in 2 10-IDs
# iterations and 8 leftover call
mocked_service_method.return_value = ('some_fake_id', None)
self.assertEqual(mocked_service_method.call_count, 3)
^ Количество вызовов действительно равно 3, и я могу видеть эти отпечатки:
iter: 0, IDS count: 10, IDS: [62195, 62194, 62193, 62192, 62191, 62190, 62189, 62188, 62187, 62186]
iter: 1, IDS count: 10, IDS: [62185, 62184, 62183, 62182, 62181, 62180, 62179, 62178, 62177, 62176]
leftover IDS count: 8, IDS: [62175, 62174, 62173, 62172, 62171, 62170, 62169, 62168]
log_ids: [62195, 62194, 62193, 62192, 62191, 62190, 62189, 62188, 62187, 62186, 62185, 62184, 62183, 62182, 62181, 62180, 62179, 62178, 62177, 62176, 62175, 62174, 62173, 62172, 62171, 62170, 62169, 62168]
Однако, my_service
издевательство send_payload_to_some_other_service
, похоже, показывает, что все вызовы были сделаны с использованием одинаковых args, который, как оказалось, был последним использован:
ipdb> mocked_service_method.call_args_list
[call(<location.of.service.MyService object at 0x7f1a43bbec50>, {..., 'object_ids': [62175, 62174, 62173, 62172, 62171, 62170, 62169, 62168]}),
call(<location.of.service.MyService object at 0x7f1a43bbec50>, {..., 'object_ids': [62175, 62174, 62173, 62172, 62171, 62170, 62169, 62168]}),
call(<location.of.service.MyService object at 0x7f1a43bbec50>, {..., 'object_ids': [62175, 62174, 62173, 62172, 62171, 62170, 62169, 62168]})]
Чтобы убедиться в этом, я удалил имитатор для сервиса, а в методе, который я имитировал, вывел входящие идентификаторы, удалил все действия, выполняемые там, и вернул поддельный ответ:
IDS: 28
iter: 0, IDS count: 10, IDS: [62615, 62614, 62613, 62612, 62611, 62610, 62609, 62608, 62607, 62606]
Payload in send_payload_to_some_other_service: {..., 'object_ids': [62615, 62614, 62613, 62612, 62611, 62610, 62609, 62608, 62607, 62606]}
iter: 1, IDS count: 10, IDS: [62605, 62604, 62603, 62602, 62601, 62600, 62599, 62598, 62597, 62596]
Payload in send_payload_to_some_other_service: {..., 'object_ids': [62605, 62604, 62603, 62602, 62601, 62600, 62599, 62598, 62597, 62596]}
leftover IDS count: 8, IDS: [62595, 62594, 62593, 62592, 62591, 62590, 62589, 62588]
Payload in send_payload_to_some_other_service: {..., 'object_ids': [62595, 62594, 62593, 62592, 62591, 62590, 62589, 62588]}
log_ids: [62615, 62614, 62613, 62612, 62611, 62610, 62609, 62608, 62607, 62606, 62605, 62604, 62603, 62602, 62601, 62600, 62599, 62598, 62597, 62596, 62595, 62594, 62593, 62592, 62591, 62590, 62589, 62588]
^ Вы можете видеть, что это всегда сводка всех идентификаторов, и все происходит так, как должно происходить.
Похоже, что есть проблема с mock
, или я делаю что-то неправильно?
.
Спасибо!