Getting Started with Moto

Installing Moto

You can use pip to install the latest released version of moto:

pip install moto

If you want to install moto from source:

git clone git://github.com/spulec/moto.git
cd moto
python setup.py install

Moto usage

For example, we have the following code we want to test:

import boto3

class MyModel(object):
    def __init__(self, name, value):
        self.name = name
        self.value = value

    def save(self):
        s3 = boto3.client('s3', region_name='us-east-1')
        s3.put_object(Bucket='mybucket', Key=self.name, Body=self.value)

There are several ways to do this, but you should keep in mind that Moto creates a full, blank environment.

Decorator

With a decorator wrapping, all the calls to S3 are automatically mocked out.

import boto3
from moto import mock_s3
from mymodule import MyModel

@mock_s3
def test_my_model_save():
    conn = boto3.resource('s3', region_name='us-east-1')
    # We need to create the bucket since this is all in Moto's 'virtual' AWS account
    conn.create_bucket(Bucket='mybucket')

    model_instance = MyModel('steve', 'is awesome')
    model_instance.save()

    body = conn.Object('mybucket', 'steve').get()[
        'Body'].read().decode("utf-8")

    assert body == 'is awesome'

Context manager

Same as the Decorator, every call inside the with statement is mocked out.

def test_my_model_save():
    with mock_s3():
        conn = boto3.resource('s3', region_name='us-east-1')
        conn.create_bucket(Bucket='mybucket')

        model_instance = MyModel('steve', 'is awesome')
        model_instance.save()

        body = conn.Object('mybucket', 'steve').get()[
            'Body'].read().decode("utf-8")

        assert body == 'is awesome'

Raw

You can also start and stop the mocking manually.

def test_my_model_save():
    mock = mock_s3()
    mock.start()

    conn = boto3.resource('s3', region_name='us-east-1')
    conn.create_bucket(Bucket='mybucket')

    model_instance = MyModel('steve', 'is awesome')
    model_instance.save()

    body = conn.Object('mybucket', 'steve').get()[
        'Body'].read().decode("utf-8")

    assert body == 'is awesome'

    mock.stop()

Stand-alone server mode

Moto also comes with a stand-alone server allowing you to mock out an AWS HTTP endpoint. For testing purposes, it’s extremely useful even if you don’t use Python.

$ moto_server ec2 -p3000
 * Running on http://127.0.0.1:3000/

However, this method isn’t encouraged if you’re using boto, the best solution would be to use a decorator method.