[英]Python testing: mocking a function that's imported AND used inside another funciton
由於Django中Celery任務常見的循環導入問題,我經常在方法內部導入Celery任務,如下所示:
# some code omitted for brevity
# accounts/models.py
def refresh_library(self, queue_type="regular"):
from core.tasks import refresh_user_library
refresh_user_library.apply_async(
kwargs={"user_id": self.user.id}, queue=queue_type
)
return 0
在我的refresh_library
pytest
測試中,我只想測試是否使用正確的args
和kwargs
調用refresh_user_library
(Celery任務)。 但這不起作用:
# tests/test_accounts_models.py
@mock.patch("accounts.models.UserProfile.refresh_library.refresh_user_library")
def test_refresh_library():
錯誤是關於refresh_library
沒有屬性refresh_user_library
。
我懷疑這是由於task( refresh_user_library
)導入了函數本身內部,但是我對模擬沒有太多的經驗,所以這可能是完全錯誤的。
即使apply_async
是您在core.tasks
自己創建的函數,如果您不想對其進行測試,而是僅確保輸入正確的參數,就需要對其進行模擬。 在您的問題中,您嘲笑錯誤的程序包。 你應該做:
# tests/test_accounts_models.py
@mock.patch("core.tasks.rehresh_user_library.apply_sync")
def test_refresh_library():
在您的任務函數中, refresh_user_library
是本地名稱,而不是任務的屬性。 您想要的是您要模擬的函數的真實限定名稱:
@mock.patch("core.tasks.refresh_user_library")
def test_refresh_library():
# you test here
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.