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, или я делаю что-то неправильно?

. Спасибо!

Вернуться на верх