113 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			113 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								=========================
							 | 
						||
| 
								 | 
							
								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:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.. 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)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								There are several method to do this, just keep in mind Moto creates a full blank environment.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Decorator
							 | 
						||
| 
								 | 
							
								~~~~~~~~~
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								With a decorator wrapping all the calls to S3 are automatically mocked out.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.. 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
							 | 
						||
| 
								 | 
							
								~~~~~~~~~~~~~~~
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Same as decorator, every call inside ``with`` statement are mocked out.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.. 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
							 | 
						||
| 
								 | 
							
								~~~
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You can also start and stop manually the mocking.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.. 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
							 | 
						||
| 
								 | 
							
								~~~~~~~~~~~~~~~~~~~~~~~
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Moto comes with a stand-alone server allowing you to mock out an AWS HTTP endpoint. It is very useful to test even if you don't use Python.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.. sourcecode:: bash
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    $ moto_server ec2 -p3000
							 | 
						||
| 
								 | 
							
								     * Running on http://0.0.0.0:3000/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This method isn't encouraged if you're using ``boto``, best is to use decorator method.
							 |