У меня есть signal_handler, подключенный через декоратор, что-то вроде этого очень простого:
@receiver(post_save, sender=User,
dispatch_uid='myfile.signal_handler_post_save_user')
def signal_handler_post_save_user(sender, *args, **kwargs):
# do stuff
Что я хочу сделать, это издеваться над ним с макетной библиотекой http://www.voidspace.org.uk/python/mock/ в тесте, чтобы проверить, сколько раз django называет это. Мой код на данный момент выглядит примерно так:
def test_cache():
with mock.patch('myapp.myfile.signal_handler_post_save_user') as mocked_handler:
# do stuff that will call the post_save of User
self.assert_equal(mocked_handler.call_count, 1)
Проблема заключается в том, что исходный обработчик сигнала вызывается, даже если высмеивается, скорее всего, потому что декодер @receiver
хранит копию обработчика сигнала где-то, поэтому я издеваюсь над неправильным кодом.
Итак, вопрос: как мне высмеять мой обработчик сигнала, чтобы моя тестовая работа?
Обратите внимание, что если я изменил свой обработчик сигнала на:
def _support_function(*args, **kwargs):
# do stuff
@receiver(post_save, sender=User,
dispatch_uid='myfile.signal_handler_post_save_user')
def signal_handler_post_save_user(sender, *args, **kwargs):
_support_function(*args, **kwargs)
и я притворяюсь _support_function
, все работает как ожидалось.