2017-10-19 22 views
2

J'écris un test pour les fonctions boto3 et en utilisant la bibliothèque moto pour simuler boto3.Mocking boto3 appels réels boto3

L'exemple qu'ils fournissent en tant que tel:

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' 

Cependant quand j'essayer quelque chose de similaire, en utilisant un exemple trivial ici, en faisant ceci:

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 

Pourquoi est-il en fait faire la demande à AWS quand j'ai clairement la fonction enveloppée dans le moqueur?

+0

Regardez également dans des choses comme FakeS3, si vous avez besoin d'un vrai simulacre de services S3 qui vous permettent de stocker temporairement des fichiers pour tester la fonctionnalité des applications sur S3. – mootmoot

+0

Je fais plus de travail EC2 que tout, mais je vais le garder à l'esprit. Une autre bibliothèque sympa que j'ai vue était 'placebo' qui enregistre vos appels réels vers AWS et stocke les résultats dans un répertoire que vous pouvez ensuite utiliser pour tester. – eagle

+0

Je teste généralement le script de déploiement pour déployer des tâches sur l'instance t2.nano/micro. Ijust échanger l'instance t2 avec l'instance réelle pour la production – mootmoot

Répondre

1

En regardant le README.md de moto for boto/boto3, je remarque sur le code de connexion S3, il y a une remarque

# Nous devons créer le seau car cela est dans « virtuel » de Moto AWS compte

Si je me trompe, l'erreur affichée n'est pas une erreur AWS, mais une erreur Moto. Vous devez initialiser toutes les ressources fictives que vous voulez imiter dans l'espace virtuel Moto. Cela signifie que vous devez utiliser un autre script pour utiliser moto pour simuler "create_instance" avant de pouvoir démarrer l'instance.

+0

c'est exactement cela, j'ai posté mon commentaire ci-dessous aussi bien. Je vais aller de l'avant et accepter car c'est la même réponse exacte à ma solution. – eagle

0

Ainsi, après tendre la main à certains des contributeurs, on m'a dit que:

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.

Pour utiliser les services qui nécessitent une certaine ressource, vous devez d'abord créer ce service simulé. Pour que ma fonction fonctionne, je suis allé de l'avant et me suis moqué d'un appel au create_instance que je peux ensuite utiliser pour tester davantage. J'espère que cela aide ceux qui trébuchent sur cela à un moment donné dans le futur.