Прежде всего, вы должны заключить в декоратор не функцию, которую вы хотите использовать в качестве замены, а «область», в которой должен работать ваш макет.Так, например, если вам нужно смоделировать _start_processing
для всего класса MyModelTests
, вы должны поместить декоратор перед определением класса.Если только для одного метода тестирования - оберните им только метод теста.
Во-вторых, определите, что start_processing
функция где-то вне класса, и передайте @patch('my_app.models.MyModel._start_processing', new=start_processing)
, чтобы он знал, что использовать в качестве замены дляактуальный метод.Но имейте в виду, что она соответствует фактической сигнатуре метода, поэтому используйте просто
def start_processing(self):
print('This is when the task would normally be run, but this is a test!')
В-третьих, вам нужно будет добавить аргумент mock_start_processing
к каждому тестовому случаю внутри этого класса (методы test _...), просто потому, чтоиздевательство работает так:).
И наконец.Вы должны знать о target
, который вы исправляете.Ваш текущий my_app.models.MyModel._start_processing
может быть сломан.Вы должны пропатчить класс, используя путь, в котором он используется, а не там, где он определен.Итак, если вы создаете объекты с MyModelFactory
внутри TestCase
, а MyModelFactory
живет с my_app.factories
и импортирует MyModel
как from .models import MyModel
, вам придется использовать @patch('my_app.factories.MyModel._start_processing')
, а не 'my_app.models.MyModel._start_processing'
.
Надеюсь, это поможет.