[英]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.