Дразнящий boto3 вызывает актуальный boto3
Я пишу тест для 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, когда у меня явно есть завернутая функция в макере?
2 ответа
Глядя на README.md из moto для boto / boto3, замечаю код подключения S3, там есть замечания
# Нам нужно создать корзину, так как это все в "виртуальной" учетной записи AWS Moto.
Если я прав, показанная ошибка - не ошибка AWS, а ошибка Moto. Вам нужно инициализировать все фиктивные ресурсы, которые вы хотите имитировать, в виртуальном пространстве Moto. Это означает, что вам нужно использовать другой скрипт, чтобы использовать moto для создания надписи "create_instance", прежде чем вы сможете запустить экземпляр.
Поэтому после обращения к некоторым авторам мне сказали, что:
Moto isn't like a MagicMock--it's an actual in-memory representation of the AWS resources. So you can't start an instance you haven't created, you can't create an instance in a vpc you haven't previously defined in Moto, etc.
Чтобы использовать сервисы, требующие определенного ресурса, сначала необходимо создать этот фиктивный сервис. Для того, чтобы моя функция работала, я пошел дальше и высмеял звонок create_instance
который я могу затем использовать для дальнейшего тестирования. Надеюсь, что это поможет тем, кто сталкивается с этим в будущем.