2013-02-18 21:16:15 +00:00
|
|
|
# Moto - Mock Boto
|
2013-02-16 03:15:43 +00:00
|
|
|
|
2013-02-18 21:10:56 +00:00
|
|
|
# WARNING: Moto is still in active development
|
|
|
|
|
2013-02-16 03:15:43 +00:00
|
|
|
# In a nutshell
|
|
|
|
|
|
|
|
Moto is a library that allows your python tests to easily mock out the boto library
|
|
|
|
|
|
|
|
Imagine you have the following code that you want to test:
|
|
|
|
|
|
|
|
```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):
|
2013-02-18 21:09:40 +00:00
|
|
|
conn = boto.connect_s3()
|
2013-02-16 03:15:43 +00:00
|
|
|
bucket = conn.get_bucket('mybucket')
|
|
|
|
k = Key(bucket)
|
|
|
|
k.key = self.name
|
|
|
|
k.set_contents_from_string(self.value)
|
|
|
|
```
|
|
|
|
|
|
|
|
Take a minute to think how you would have tested that in the past.
|
|
|
|
|
|
|
|
Now see how you could test it with Moto.
|
|
|
|
|
|
|
|
```python
|
|
|
|
import boto
|
|
|
|
from moto import mock_s3
|
|
|
|
from mymodule import MyModel
|
|
|
|
|
|
|
|
@mock_s3
|
|
|
|
def test_my_model_save():
|
|
|
|
model_instance = MyModel('steve', 'is awesome')
|
|
|
|
model_instance.save()
|
|
|
|
|
|
|
|
conn = boto.connect_s3()
|
|
|
|
assert conn.get_bucket('mybucket').get_key('steve') == 'is awesome'
|
|
|
|
```
|
|
|
|
|
|
|
|
With the decorator wrapping the test, all the calls to s3 are automatically mocked out. The mock keeps the state of the buckets and keys.
|
|
|
|
|
2013-02-28 05:09:58 +00:00
|
|
|
It gets even better! Moto isn't just S3. Here's the status of the other AWS services implemented.
|
2013-02-16 03:15:43 +00:00
|
|
|
|
2013-02-28 05:12:12 +00:00
|
|
|
* DynamoDB (@mock_dynamodb)
|
2013-02-28 05:09:58 +00:00
|
|
|
* Table actions - core done
|
2013-02-28 05:12:12 +00:00
|
|
|
* EC2 (@mock_ec2)
|
2013-02-28 05:09:58 +00:00
|
|
|
* AMI - core done
|
|
|
|
* EBS - core done
|
|
|
|
* Instances - completed
|
|
|
|
* Security Groups - core done
|
|
|
|
* Tags - completed
|
2013-02-28 05:12:12 +00:00
|
|
|
* S3 (@mock_s3) - core done
|
|
|
|
* SES (@mock_ses) - core done
|
|
|
|
* SQS (@mock_sqs) - core done
|
2013-02-16 03:15:43 +00:00
|
|
|
|
2013-02-28 05:09:58 +00:00
|
|
|
This library has been tested on boto v2.5+.
|
2013-02-28 03:25:15 +00:00
|
|
|
|
|
|
|
## Usage
|
|
|
|
|
|
|
|
All of the services can be used as a decorator, context manager, or in a raw form.
|
|
|
|
|
|
|
|
### Decorator
|
|
|
|
|
|
|
|
```python
|
|
|
|
@mock_s3
|
|
|
|
def test_my_model_save():
|
|
|
|
model_instance = MyModel('steve', 'is awesome')
|
|
|
|
model_instance.save()
|
|
|
|
|
|
|
|
conn = boto.connect_s3()
|
|
|
|
assert conn.get_bucket('mybucket').get_key('steve') == 'is awesome'
|
|
|
|
```
|
|
|
|
|
|
|
|
### Context Manager
|
|
|
|
|
|
|
|
```python
|
|
|
|
def test_my_model_save():
|
|
|
|
with mock_s3():
|
|
|
|
model_instance = MyModel('steve', 'is awesome')
|
|
|
|
model_instance.save()
|
|
|
|
|
|
|
|
conn = boto.connect_s3()
|
|
|
|
assert conn.get_bucket('mybucket').get_key('steve') == 'is awesome'
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Raw use
|
|
|
|
|
|
|
|
```python
|
|
|
|
def test_my_model_save():
|
|
|
|
mock = mock_s3()
|
|
|
|
mock.start()
|
|
|
|
|
|
|
|
model_instance = MyModel('steve', 'is awesome')
|
|
|
|
model_instance.save()
|
|
|
|
|
|
|
|
conn = boto.connect_s3()
|
|
|
|
assert conn.get_bucket('mybucket').get_key('steve') == 'is awesome'
|
|
|
|
|
|
|
|
mock.stop()
|
|
|
|
```
|
2013-02-28 05:09:58 +00:00
|
|
|
|
2013-02-28 05:16:16 +00:00
|
|
|
## Install
|
2013-02-28 05:09:58 +00:00
|
|
|
|
|
|
|
```console
|
2013-02-28 05:15:46 +00:00
|
|
|
$ pip install moto
|
2013-02-28 05:09:58 +00:00
|
|
|
```
|