Если я правильно помню, вы должны положить вокруг него контейнер (например, JScrollPane
).
Ваш патч должен читать @patch('module.file2.f1.method_1')
Я расскажу вам, почему:
test_determine_failure_modes.py
импортирует file1 as f1
. Затем file1
читается, и он определяет method1
в своих локальных. Это становится доступным на символе f1
.
Итак, таблицы символов выглядят следующим образом:
file1: {'method1': <function>, <METHOD_1>, ...}
f1: {'method1': <function>, <METHOD_1>, ...}
Затем вы исправляете file1.method1
и получаете эту таблицу символов
file1: {'method1': <function>, MOCK, ...}
f1: {'method1': <function>, <METHOD_1>, ...}
Затем вы вызываете f1.method1
и получаете фактический функция.
Похоже, вы используете method_dict
для ссылки на функцию, поэтому вам все же нужно немного углубиться. К счастью, в unittest.mock.patch
есть утилита для насмешки содержимого диктов, например:
with patch.dict(f2.method_dict, {'method1': your_mock_here}):
your_test_here()
Еще один способ - отложить разрешение имени метода до того, как он будет смоделирован.
method_dict = {
'method_1' : lambda data: f1.method1(data),
'method_2' : lambda data: f1.method2(data),
'method_3' : lambda data: f1.method3(data)
}
Здесь, поиск для f1.method1 не происходит до тех пор, пока он не будет проверен. В предыдущем случае вы помещаете ссылку на функцию, когда file2 был прочитан. Здесь ссылка не разрешается, пока метод не будет вызван.