我有過一個裝飾連接signal_handler,這樣的事情很簡單:如何模擬django信號處理程序?
@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
代替,一切正常。
的解決方案的原因不應該是'assert_equal'是' assertEquals(...)'? –
這取決於您使用的測試套件; django默認使用'unittest',它具有'assertEquals';我總是使用「鼻子」,在我看來,鼻子在許多方面都很優越,而鼻子則帶有「assert_equal」。當寫我的答案時,我從我的生產代碼複製/粘貼,這就是爲什麼你在那裏看到'assert_equal'。我編輯了答案尊重django默認,謝謝你指出這個 – StefanoP
謝謝!我也用鼻子,但從來沒有意識到assert_equal存在 –