如何为AWS中的AWS lambda函数模拟s3.Object

2024-10-04 03:21:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的lambda函数,因为我是Python新手,所以无法为该函数编写测试用例。因此,任务非常简单,我将一个xml文档上传到s3,并返回url。以下是主python文件中的代码:

编辑2:下面代码的目的是从JSON负载中生成一个xml,作为参数根传入,并将其上载到s3。s3已经有了一个bucket s3 encora任务,我必须上传output.xml。我必须为这种情况编写单元测试

def uploaddata(root):
    xmlstr = minidom.parseString(ET.tostring(root)).toprettyxml(indent="   ")
    string_out = io.StringIO()
    string_out.write(xmlstr)
    s3.Object('s3-encora-task', 'output.xml').put(Body=string_out.getvalue())
    location = boto3.client('s3').get_bucket_location(Bucket=bucket_name)['LocationConstraint']
    url = "https://s3-%s.amazonaws.com/%s/%s" % (location, bucket_name, 'output.xml')
    return url

我发现行中有错误:

s3.Object('s3-encora-task', 'output.xml').put(Body=string_out.getvalue())

以下是错误:

提出不必要的声明() botocore.exceptions.NoCredentialsError:找不到凭据

我有编写Junit测试类的经验,但我在比较Junit和unittest(以编写的方式)时遇到困难,因此无法清楚地表达我的问题。因此,我有以下问题:

  1. 在我的python文件中,我没有一个类。我在方法之外像这样实例化s3:s3=boto3.resource('s3')。那么,如何模拟这个s3对象并传递给方法,以便使用模拟对象呢
  2. 在我的测试类中,我将主要的python作为导入:importJSONTOXMLConverter作为转换器 然后使用转换器。<&燃气轮机;对于单元测试,但该方法没有将s3作为参数,所以再次说明,如何传递s3模拟对象
  3. 我读过一些关于使用moto模拟s3的文章,但无法弄清楚对象是如何传递的,所以更多关于这方面的信息会有所帮助

提前谢谢

编辑1: 下面是我的测试类中的当前代码:

     import jsontoxmlconverter as converter
    def test_jsontoxml_happyflow(self):
        with open('jsonData.txt') as json_file:
            data = json.load(json_file)
        mock = Mock()
        mock.patch('converter.s3')
        result = converter.jsontoxml(data, context={})

Tags: 对象方法函数代码jsonurloutputstring
1条回答
网友
1楼 · 发布于 2024-10-04 03:21:02

使用mock.patch

import jsontoxmlconverter as converter
from mock import patch

def test_jsontoxml_happyflow(self):
    with patch('jsontoxmlconverter.s3') as mock_s3:
        # make whatever adjustments to mock_s3 as needed
        result = converter.uploaddata("foo")

请注意,您需要告诉patch您要在哪个模块中修补s3。当您使用patch作为上下文管理器时,补丁只在上下文中应用,这使得隔离像这样的更改很容易,并保证它们不会影响其他测试。上下文中可用的mock_s3对象是一个mock.Mock对象,它取代了s3;在调用依赖于属性的函数之前,可以自由地重新分配属性

相关问题 更多 >