Permalink
Fetching contributors…
Cannot retrieve contributors at this time
115 lines (75 sloc) 2.85 KB

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 boto
from boto.s3.key import Key

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

    def save(self):
        conn = boto.connect_s3()
        bucket = conn.get_bucket('mybucket')
        k = Key(bucket)
        k.key = self.name
        k.set_contents_from_string(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 boto
from moto import mock_s3
from mymodule import MyModel

@mock_s3
def test_my_model_save():
    conn = boto.connect_s3()
    # We need to create the bucket since this is all in Moto's 'virtual' AWS account
    conn.create_bucket('mybucket')

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

    assert conn.get_bucket('mybucket').get_key('steve').get_contents_as_string() == '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 = boto.connect_s3()
        conn.create_bucket('mybucket')

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

        assert conn.get_bucket('mybucket').get_key('steve').get_contents_as_string() == 'is awesome'

Raw

You can also start and stop the mocking manually.

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

    conn = boto.connect_s3()
    conn.create_bucket('mybucket')

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

    assert conn.get_bucket('mybucket').get_key('steve').get_contents_as_string() == '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.