[英]python class method mocking failure
試圖理解模擬/補丁,我有一個寧靜的API項目,其中包含三個文件(僅供參考,我正在使用flask)
class1.py文件內容:
class one:
def addition(self):
return 4+5
domain.py文件內容:
from class1 import one
class DomainClass(Resource):
def post(self):
test1 = one()
val = test1.addition()
return {'test' : val }
test_domain.py文件內容:
import my_app
from flask_api import status
from mock import patch
app = my_app.app.test_client()
def test_post():
with patch('domain.one') as mock:
instance = mock.return_value
instance.addition.return_value = 'yello'
url = '/domain'
response = app.post(url)
print response.data
assert status.HTTP_200_OK == response.status_code
assert mock.called
對於我的test_domain.py文件,我也嘗試過此方法...
@patch('domain.one')
def test_post(mock_domain):
mock_domain.addition.return_value = 1
url = '/domain'
response = app.post(url)
print response.data
assert status.HTTP_200_OK == response.status_code
我對200個通過狀態的主張是,但是,問題是我無法模擬或修補加法以使我的值為1而不是9(4 + 5)。 我也嘗試做“斷言嘲諷”,它也失敗了。 我知道我應該在使用'one()'方法的地方進行模擬/修補,即在domain.py中而不是在class1.py中。 但是我什至嘗試模仿class1.one代替domain.one,但我仍然一直得到9而不是1。我在做什么錯?
********更新我在同一問題上遇到了另一個難題,我嘗試在test_domain文件中執行此操作,而不是進行修補。
from common.class1 import one
def test_post():
one.addition = MagicMock(return_value=40)
url = '/domain'
response = app.post(url)
print response.data
assert status.HTTP_200_OK == response.status_code
題
在上面的更新中,我沒有在使用它的地方進行過模擬(即:domain.one.addition = MagicMock(...),並且仍然有效!!!!看來它正在進行全局更改。為什么這項工作?
在上面的示例中,“ one”是模塊class1.py中的類。 如果我將此類“ one”更改為class1.py中的函數,則無法進行模擬。 似乎不能像這樣嘲笑模塊class1.py中的函數“ one” ... one.return_value ='xyz',為什么? 可以在全球范圍內嘲笑嗎?
您的代碼中存在一些問題。 在第一個示例中,您忘記了patch()
with
上下文with
應用,並且上下文結束時恢復了原始代碼。 遵循代碼應該可以工作:
def test_post():
with patch('domain.one') as mock:
instance = mock.return_value
instance.addition.return_value = 'yello'
url = '/domain'
response = app.post(url)
print response.data
assert status.HTTP_200_OK == response.status_code
assert mock.called
assert response.data['test'] == 'yello'
第二個還有另一個問題:如果只想addition
補丁,則應該使用:
@patch('domain.one.addition')
def test_post(mock_addition):
mock_addition.return_value = 1
...
assert mock_addition.called
assert response.data['test'] == 1
如果要模擬所有one
類 ,則應像第一個示例中那樣設置由mock_domain
調用返回的模擬實例的addition
的返回值:
@patch('domain.one')
def test_post(mock_domain):
mock_addition = mock_domain.return_value.addition
mock_addition.return_value = 1
...
assert mock_addition.called
assert response.data['test'] == 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.