2017-03-14 23:20:17 -04:00
.. _getting_started:
2015-07-27 11:44:41 -04:00
=========================
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
----------
2018-04-20 10:25:28 +10:00
For example, we have the following code we want to test:
2015-07-27 11:44:41 -04:00
.. sourcecode :: python
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)
2018-04-20 10:25:28 +10:00
There are several ways to do this, but you should keep in mind that Moto creates a full, blank environment.
2015-07-27 11:44:41 -04:00
Decorator
~~~~~~~~~
2018-04-20 10:25:28 +10:00
With a decorator wrapping, all the calls to S3 are automatically mocked out.
2015-07-27 11:44:41 -04:00
.. sourcecode :: python
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
~~~~~~~~~~~~~~~
2018-04-20 10:25:28 +10:00
Same as the Decorator, every call inside the `` with `` statement is mocked out.
2015-07-27 11:44:41 -04:00
.. sourcecode :: python
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
~~~
2018-04-20 10:25:28 +10:00
You can also start and stop the mocking manually.
2015-07-27 11:44:41 -04:00
.. sourcecode :: python
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
~~~~~~~~~~~~~~~~~~~~~~~
2018-04-20 10:25:28 +10:00
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.
2015-07-27 11:44:41 -04:00
.. sourcecode :: bash
$ moto_server ec2 -p3000
2016-09-01 12:14:38 +01:00
* Running on http://127.0.0.1:3000/
2015-07-27 11:44:41 -04:00
2018-04-20 10:25:28 +10:00
However, this method isn't encouraged if you're using `` boto `` , the best solution would be to use a decorator method.