繁体   English   中英

python模拟返回值不正确

[英]python mock return value not correct

我正在尝试测试python模拟,但是我的结果与预期的不符,当我推定返回值时,它显示的是模拟对象,而不是实际结果。

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'
        }

您犯了一个小错误,并在对象而不是call_api方法上设置了return_value

这是固定版本:

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}

更新 :正如@jonrsharpe指出的那样,这些测试还有另一个问题-当我嘲笑必须测试的实际方法时,它们不进行任何测试。

如果考虑当前示例,我们想在这里模拟requests ,而不是用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM