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