我正在为boto3
函数编写一些测试,并使用moto
库模拟boto3
。
他们提供的示例如下:
import boto3
from moto import mock_ec2
def add_servers(ami_id, count):
client = boto3.client('ec2', region_name='us-west-1')
client.run_instances(ImageId=ami_id, MinCount=count, MaxCount=count)
@mock_ec2
def test_add_servers():
add_servers('ami-1234abcd', 2)
client = boto3.client('ec2', region_name='us-west-1')
instances = client.describe_instances()['Reservations'][0]['Instances']
assert len(instances) == 2
instance1 = instances[0]
assert instance1['ImageId'] == 'ami-1234abcd'
但是,当我尝试类似的操作时,通过执行以下操作,在此处使用一个简单的示例:
def start_instance(instance_id):
client = boto3.client('ec2')
client.start_instances(InstanceIds=[instance_id])
@mock_ec2
def test_start_instance():
start_instance('abc123')
client = boto3.client('ec2')
instances = client.describe_instances()
print instances
test_start_instance()
ClientError: An error occurred (InvalidInstanceID.NotFound) when calling the StartInstances operation: The instance ID '[u'abc123']' does not exist
当我将功能明显包装在模拟程序中时,为什么实际上要向AWS发出请求?
最佳答案
查看moto for boto/boto3的README.md,我注意到
在S3连接代码上,有一个注释
#我们需要创建存储桶,因为这都是Moto的“虚拟”
AWS账户
如果我是正确的,则显示的错误不是AWS错误,而是Moto错误。您需要初始化要模拟到Moto虚拟空间的所有模拟资源。这意味着,在启动实例之前,您需要使用另一个脚本来使用moto来模拟“ create_instance”。
关于python - 模拟boto3调用实际的boto3,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46835804/