2017-10-19 7 views
2

Ich schreibe einen Test für boto3 Funktionen und mit der moto Bibliothek zu spotten boto3.Mocking Boto3 Anrufe aktuelle Boto3

Das Beispiel bieten sie ist als solche:

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' 

Jedoch, wenn ich etwas ähnliches versuchen, hier ein triviales Beispiel verwenden, indem Sie diese:

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 

Warum ist es eigentlich antrag zu AWS wenn ich die Funktion eindeutig in den Spötter gehüllt habe?

+0

Schauen Sie auch in Sachen wie FakeS3, wenn Sie eine echte Mock S3-Dienste benötigen, können Sie vorübergehend speichern Datei zum Testen der App-Funktionalität auf S3. – mootmoot

+0

Ich mache mehr EC2-Arbeit als alles andere, aber ich werde es mir merken. Eine weitere coole Bibliothek, die ich gesehen habe, war "Placebo", die Ihre tatsächlichen Anrufe bei AWS aufzeichnet und die Ergebnisse in einem Verzeichnis speichert, das Sie dann zum Testen aufrufen können. – eagle

+0

Normalerweise teste ich das Deployment-Skript, um Zeug auf t2.nano/micro-Instanz bereitzustellen. Ich tausche die t2-Instanz mit der tatsächlichen Instanz für die Produktion – mootmoot

Antwort

1

Mit Blick auf der README.md von moto for boto/boto3, ich auf dem S3-Verbindungscode bemerken, ist es eine Bemerkung

# Wir brauchen den Eimer zu schaffen, da dies alles in der Moto ist ‚virtuellen‘ AWS Konto

Wenn ich richtig bin, ist der Fehler nicht AWS Fehler, aber Moto Fehler. Sie müssen alle Mock-Ressourcen initialisieren, die Sie dem virtuellen Bereich von Moto vortäuschen möchten. Dies bedeutet, dass Sie ein anderes Skript verwenden müssen, um mit moto "create_instance" vorzuspielen, bevor Sie die Instanz starten können.

+0

das ist genau das, ich habe meinen Kommentar auch unten gepostet. Ich werde weitermachen und akzeptieren, da dies die exakt gleiche Antwort auf meine Lösung ist. – eagle

0

So, nachdem ich einige der Mitwirkenden Annäherung wurde gesagt, dass:

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.

Um Dienste zu nutzen, die eine bestimmte Ressource benötigen Sie zunächst, dass Mock-Service anlegen. Für meine Funktion zu arbeiten ging ich voran und verspottete einen Anruf zu create_instance, den ich dann verwenden kann, um weiter zu testen. Hoffe das hilft denen, die irgendwann in der Zukunft darüber stolpern.