簡體   English   中英

Python測試:模擬在另一個函數中導​​入並使用的函數

[英]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測試中,我只想測試是否使用正確的argskwargs調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM