Ваш патч должен читать @patch('module.file2.f1.method_1')
Я расскажу вам, почему:
test_determine_failure_modes.py
import 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
имеет утилиту для насмешки содержимого dict следующим образом:
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 был прочитан.Здесь ссылка не разрешается до тех пор, пока метод не будет вызван.