Python:如何模拟辅助方法?

时间:2018-09-18 07:10:00

标签: python unit-testing aws-lambda

您能帮我弄清楚我做错了什么吗?我对python lambdas进行了以下单元测试

class Tests(unittest.TestCase):
    def setUp(self):
        //some setup

    @mock.patch('functions.tested_class.requests.get')
    @mock.patch('functions.helper_class.get_auth_token')
    def test_tested_class(self, mock_auth, mock_get):

        mock_get.side_effect = [self.mock_response]
        mock_auth.return_value = "some id token"

        response = get_xml(self.event, None)

        self.assertEqual(response['statusCode'], 200)

问题是,当我运行此代码时,我收到get_auth_token的以下错误:

 Invalid URL '': No schema supplied. Perhaps you meant http://?

我调试了它,但看起来好像我没有正确打补丁。授权帮助程序文件与测试的类位于同一文件夹“功能”中。

编辑: 在tested_class中,我像这样导入get_auth_token:

from functions import helper_class
from functions.helper_class import get_auth_token
...
def get_xml(event, context):
    ...
    response_token = get_auth_token()

更改为此后,它开始正常工作

import functions.helper_class
...
def get_xml(event, context):
    ...
    response_token = functions.helper_class.get_auth_token()

我仍然不完全理解为什么

2 个答案:

答案 0 :(得分:1)

  • 在第一种情况下

tested_class.py中,get_auth_token已导入

from functions.helper_class import get_auth_token

补丁应与get_auth_token上的tested_class完全相同

@mock.patch('functions.tested_class.get_auth_token')
  • 第二种情况

具有以下用法

 response_token = functions.helper_class.get_auth_token()

唯一的修补方法是

@mock.patch('functions.helper_class.get_auth_token')
  • 替代

tested_class中使用这样的导入

from functions import helper_class
helper_class.get_auth_token()

补丁可能是这样的:

@mock.patch('functions.tested_class.helper_class.get_auth_token')

答案 1 :(得分:0)

patch()通过(临时)将名称指向的对象更改为另一个对象来工作。可以有许多名称指向任何单个对象,因此要进行修补,必须确保对被测系统使用的名称进行修补。

基本原理是,您修补查找对象的位置,该对象不一定与定义对象的位置相同。

Python文档有一个很好的例子。 where to patch