我正在尝试测试python mock但是我的结果并不像预期的那样,当我修改返回值时它显示模拟对象而不是实际结果。
import mock
import unittest
import constants
import requests
class GetAddr():
def __init__(self,name=''):
self.name = name
def call_api(self):
incr = 1
self.no_of_calls(incr)
r = requests.get('http://test.com')
return r.text
def no_of_calls(self,incr):
counter = incr + 1
return counter
class TestGetAddr(unittest.TestCase):
maxDiff = None
def test_case_1(self):
self.getaddr = mock.MagicMock(GetAddr(name='John'))
self.getaddr.return_value = {
'return_code':200,
'text':'CA, USA'
}
print self.getaddr.call_api()
if __name__ == '__main__':
unittest.main()
输出: -
<MagicMock name='mock.call_api()' id='4526569232'>
预期结果: - 打印字典
{
'return_code':200,
'text':'CA, USA'
}
答案 0 :(得分:0)
您犯了一个小错误,并在对象上设置call_api
,而不是class TestGetAddr(unittest.TestCase):
maxDiff = None
def test_case_1(self):
self.getaddr = mock.MagicMock(GetAddr(name='John'))
self.getaddr.call_api.return_value = { # <-- notice call_api here
'return_code':200,
'text':'CA, USA'
}
print self.getaddr.call_api()
方法。
这是一个固定版本:
{'text': 'CA, USA', 'return_code': 200}
输出:
requests
<强>更新强>: 正如@jonrsharpe发现这些测试存在另一个问题 - 他们没有测试任何东西,因为我嘲笑了必须测试的实际方法。
如果我们考虑当前的示例,我们想在这里模拟call_api
,而不是class TestGetAddr(unittest.TestCase):
maxDiff = None
@mock.patch('requests.get')
def test_case_1(self, requests_get_mock):
expected_result = 'test.com has been called'
response = mock.MagicMock()
response.text = expected_result
requests_get_mock.return_value = response
instance = GetAddr(name='John')
result = instance.call_api()
self.assertEquals(result, expected_result)
方法来进行实际的单元测试。请注意断言并在更新版本中设置模拟:
{{1}}