簡體   English   中英

功能的Python unittest.mock.patch不起作用

[英]Python unittest.mock.patch for function don't work

我正在嘗試通過嘲笑我的python應用程序使用unittests,但它不能正常工作。 我的代碼:

test_file.py

from unittest.mock import patch

class TestMaterialsUpdate(TestCase):
    def setUp(self):
        self.client = Client()

    @patch('api.accounts.helpers.get_authenticated_user', return_value={'username': 'username'})
    def test_my_castom_method(self):
       import api.accounts.helpers as he
       print(he.get_authenticated_user) # printed mock here
       print(he.get_authenticated_user) # returned {'username': 'username'}

       url = reverse('materials_create')
       # next call get_authenticated_user will be in post request
       self.client.post(url,data=json.dumps({'data': 'data'}), content_type='application/json')

發布請求調用裝飾器,該裝飾器使用get_authenticated_user函數檢查“ user auth”。 但是在裝飾器中我得到了函數而不是模擬對象。

decorators.py

def login_required(func):
    def wrapper(*args, **kwargs):
        print(get_authenticated_user) # printed <function get_authenticated_user at 0x7fec34b62510>
        user = get_authenticated_user(request) # return None instead {'username: 'username'}

為什么在decorators.py有一個函數而不是模擬對象? Python版本是3.4.0

您似乎在修補錯誤的位置。 decorators.py您使用的是全局名稱get_authenticated_user() ,但您是在api.accounts.helpers中修補名稱。

您可能使用以下命令導入了get_authenticated_user

from api.accounts.helpers import get_authenticated_user

這意味着修補原始位置不會改變decorators的參考

decorators修補全局decorators

@patch('decorators.get_authenticated_user', return_value={'username': 'username'})

另請參見mock文檔的“ 何處修補”部分

patch()通過(臨時)將名稱指向的對象更改為另一個對象來工作。 可以有許多名稱指向任何單個對象,因此要使修補程序起作用,必須確保修補受測系統使用的名稱。

基本原理是,您修補在其中查找對象的位置,該對象不一定與定義對象的位置相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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