Я использую Python2.7 и модули unittest
и mock
для этой версии.У меня есть ситуация, когда я хотел бы смоделировать вызов функции экземпляра класса и его возвращаемое значение.Проблема в том, что этот экземпляр является членом экземпляра другого класса.Позвольте мне уточнить в коде.
Допустим, у меня есть класс Bin
, определенный в my_package/bin.py
:
class Bin():
def __init__(self):
# code to initialize other stuff
self.rubbish = self.fill_with_rubbish() # creates list of rubbish instances
def inspect_rubbish(self):
inspection_results = []
for rubbish in self.rubbish:
inspection_results.append(rubbish.inspect())
У меня также есть класс Rubbish
, определенный в my_package/rubbish.py
:
class Rubbish():
def __init__(self):
# initialization stuff
def inspect(self):
return 'Nice rubbish'
Теперь в моей папке /tests
есть тестовый файл test_bin.py
, в котором я настраиваю среду и импортирую мусорное ведро и мусор следующим образом:
import my_package.bin as _bin
import my_package.rubbish as _rubbish
и япытаюсь проверить inspect_rubbish()
класса Bin
.Вышесказанное, безусловно, не мой рабочий код, но в моем исходном коде я хотел бы иметь возможность изменить значение повторной настройки inspect
для Rubbish
isntance и выполнять различные assert
вызовы для проверкисколько раз он вызывался и т. д.
Я застрял на том, как на самом деле издеваться над методами экземпляров мусора экземпляра Bin.Я пытался решить проблему с некоторыми исправлениями, но безрезультатно.
def test_inspect_rubbish(self):
with patch('my_package.bin.Bin', autospec=True) as mock_bin, \
patch.object('my_package.rubbish.Rubbish.inspect') as mock_inspect:
mock_inspect.return_value = 'Bad rubbish'
bin = _bin.Bin()
bin.rubbish = [MagicMock(), MagicMock()]
result = bin.inspect_rubbish()
mock_inspect.assert_called()
Но этот код не работает с AssertionError: Expected 'inspect' to have been called.
, поэтому я предполагаю, что он вообще не выполняет то, к чему я намереваюсь.Как бы я стал издеваться над этим поведением и впоследствии делать на нем утверждения?