Я хотел бы проверить метод, вызывает ли он определенный метод временного внутреннего объекта или нет. (ConfigParser.read)
Таким образом, объект создается внутри и недоступен снаружи после выхода из метода.
Использование питона 2.7
В foobar.py
import ConfigParser
class FooBar:
def method(self, filename):
config=ConfigParser.ConfigParser()
config.read(filename)
do_some_stuff()
Я хотел бы проверить, был ли вызван config.read.
Как я понимаю, патч-декоратор был сделан для этого, но, к сожалению, объект MagicMock, который получает тесткейс, не тот, который создается внутри, и я не могу подобраться к объекту, который живет внутри метода.
Я пробовал так:
class TestFooBar(TestCase):
def setUp(self):
self.myfoobar = FooBar()
@mock.patch('foobar.ConfigParser')
def test_read(self,mock_foobar):
self.myfoobar.method("configuration.ini")
assert mock_foobar.called # THIS IS OKAY
assert mock_foobar.read.called # THIS FAILS
mock_foobar.read.assert_called_with("configuration.ini") # FAILS TOO
Проблема в следующем: - mock_foobar создается до того, как self.myfoobar.method создает внутри ConfigReader. - при отладке mock_foobar имеет внутренние данные о предыдущих вызовах, но не имеет свойства "read" (внутренний MagicMock для имитации метода чтения)
Конечно, один из выходов - это рефакторинг и предоставление .read() или init() объекта ConfigReader, но не всегда возможно изменить код, и я хотел бы понять внутренние объекты. метода, не касаясь тестируемого модуля.