Дразнящий 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 который я могу затем использовать для дальнейшего тестирования. Надеюсь, что это поможет тем, кто сталкивается с этим в будущем.

Другие вопросы по тегам