Есть несколько способов добиться этого.Простейшим подходом может быть просто отказаться от вложенной функции getitem()
и настроить побочный эффект, используя последовательность OperationalError
s.Затем вы можете проверить количество попыток с помощью gi
пропатченного объекта call_count
.Например:
def test_wait_for_db(self):
"""Test waiting for db"""
with patch('django.db.utils.ConnectionHandler.__getitem__') as gi:
gi.side_effect = [OperationalError] * 5 + [True]
call_command('wait_for_db')
self.assertGreaterEqual(gi.call_count, 5) # Verify using the call_count
Если вы хотите сохранить функцию getitem()
, я думаю, вам просто нужно сделать attempt
переменную nonlocal
, чтобы ее можно было увидеть во вложенной функции:
def test_wait_for_db(self):
"""Test waiting for db"""
attempt = 0
def getitem(alias):
nonlocal attempt # Make the outer attempt variable visible
if attempt < 5:
attempt += 1
raise OperationalError()
else:
return True
with patch('django.db.utils.ConnectionHandler.__getitem__') as gi:
gi.side_effect = getitem
call_command('wait_for_db')
self.assertGreaterEqual(attempt, 5)
В-третьих, и, как предлагается в комментариях, вы можете создать класс с атрибутом attempt
и использовать экземпляр класса в качестве побочного эффекта:
def test_wait_for_db(self):
"""Test waiting for db"""
class Getitem:
def __init__(self):
self.attempt = 0
def __call__(self, item):
if self.attempt < 5:
self.attempt += 1
raise OperationalError()
else:
return True
with patch('django.db.utils.ConnectionHandler.__getitem__') as gi:
getitem = Getitem()
gi.side_effect = getitem
call_command('wait_for_db')
self.assertGreaterEqual(getitem.attempt, 5) # Access the attempts from the instance