次の非常に単純なもののような、デコレータを介して接続された 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
代わりにモックを作成すると、すべてが期待どおりに機能します。