python mock返回值不正确

时间:2017-12-03 16:18:01

标签: python unit-testing

我正在尝试测试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'
        }

1 个答案:

答案 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}}