Skip to content

Repository files navigation

Moto - Mock Boto

Build StatusCoverage Status

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:

importbotofromboto.s3.keyimportKeyclassMyModel(object):
def__init__(self, name, value):
self.name=nameself.value=valuedefsave(self):
conn=boto.connect_s3()
bucket=conn.get_bucket('mybucket')
k=Key(bucket)
k.key=self.namek.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:

importbotofrommotoimportmock_s3frommymoduleimportMyModel@mock_s3deftest_my_model_save():
conn=boto.connect_s3()
# We need to create the bucket since this is all in Moto's 'virtual' AWS accountconn.create_bucket('mybucket')
model_instance=MyModel('steve', 'is awesome')
model_instance.save()
assertconn.get_bucket('mybucket').get_key('steve').get_contents_as_string() =='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.

It gets even better! Moto isn't just S3. Here's the status of the other AWS services implemented.

|------------------------------------------------------------------------------|| ServiceName | Decorator | DevelopmentStatus ||------------------------------------------------------------------------------|| Autoscaling | @mock_autoscaling| coreendpointsdone ||------------------------------------------------------------------------------|| Cloudformation | @mock_cloudformation| coreendpointsdone ||------------------------------------------------------------------------------|| Cloudwatch | @mock_cloudwatch | basicendpointsdone ||------------------------------------------------------------------------------|| DataPipeline | @mock_datapipeline| basicendpointsdone ||------------------------------------------------------------------------------|| DynamoDB | @mock_dynamodb | coreendpointsdone || DynamoDB2 | @mock_dynamodb2 | coreendpointsdone - noindexes ||------------------------------------------------------------------------------|| EC2 | @mock_ec2 | coreendpointsdone || - AMI | | coreendpointsdone || - EBS | | coreendpointsdone || - Instances | | allendpointsdone || - SecurityGroups | | coreendpointsdone || - Tags | | allendpointsdone ||------------------------------------------------------------------------------|| ELB | @mock_elb | coreendpointsdone ||------------------------------------------------------------------------------|| EMR | @mock_emr | coreendpointsdone ||------------------------------------------------------------------------------|| Glacier | @mock_glacier | coreendpointsdone ||------------------------------------------------------------------------------|| IAM | @mock_iam | coreendpointsdone ||------------------------------------------------------------------------------|| Kinesis | @mock_kinesis | coreendpointsdone ||------------------------------------------------------------------------------|| RDS | @mock_rds | coreendpointsdone ||------------------------------------------------------------------------------|| RDS2 | @mock_rds2 | coreendpointsdone ||------------------------------------------------------------------------------|| Redshift | @mock_redshift | coreendpointsdone ||------------------------------------------------------------------------------|| Route53 | @mock_route53 | coreendpointsdone ||------------------------------------------------------------------------------|| S3 | @mock_s3 | coreendpointsdone ||------------------------------------------------------------------------------|| SES | @mock_ses | coreendpointsdone ||------------------------------------------------------------------------------|| SNS | @mock_sns | coreendpointsdone ||------------------------------------------------------------------------------|| SQS | @mock_sqs | coreendpointsdone ||------------------------------------------------------------------------------|| STS | @mock_sts | coreendpointsdone ||------------------------------------------------------------------------------|

Another Example

Imagine you have a function that you use to launch new ec2 instances:

importbotodefadd_servers(ami_id, count):
conn=boto.connect_ec2('the_key', 'the_secret')
forindexinrange(count):
conn.run_instances(ami_id)

To test it:

from . importadd_servers@mock_ec2deftest_add_servers():
add_servers('ami-1234abcd', 2)
conn=boto.connect_ec2('the_key', 'the_secret')
reservations=conn.get_all_instances()
assertlen(reservations) ==2instance1=reservations[0].instances[0]
assertinstance1.image_id=='ami-1234abcd'

Usage

All of the services can be used as a decorator, context manager, or in a raw form.

Decorator

@mock_s3deftest_my_model_save():
conn=boto.connect_s3()
conn.create_bucket('mybucket')
model_instance=MyModel('steve', 'is awesome')
model_instance.save()
assertconn.get_bucket('mybucket').get_key('steve').get_contents_as_string() =='is awesome'

Context Manager

deftest_my_model_save():
withmock_s3():
conn=boto.connect_s3()
conn.create_bucket('mybucket')
model_instance=MyModel('steve', 'is awesome')
model_instance.save()
assertconn.get_bucket('mybucket').get_key('steve').get_contents_as_string() =='is awesome'

Raw use

deftest_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()
assertconn.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 mode. This allows you to utilize the backend structure of Moto even if you don't use Python.

To run a service:

$ moto_server ec2 * Running on http://0.0.0.0:5000/

You can also pass the port as the second argument:

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

Then go to localhost to see a list of running instances (it will be empty since you haven't added any yet).

If you want to use boto with this (using the simpler decorators above instead is strongly encouraged), the easiest way is to create a boto config file (~/.boto) with the following values:

[Boto]
is_secure = False
https_validate_certificates = False
proxy_port = 5000
proxy = 127.0.0.1

Install

$ pip install moto

Thanks

A huge thanks to Gabriel Falcão and his HTTPretty library. Moto would not exist without it.

About

Moto is a library that allows your python tests to easily mock out the boto library

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - behanceops/moto: Moto is a library that allows your python tests to easily mock out the boto library · GitHub
Skip to content

Repository files navigation

Moto - Mock Boto

Build StatusCoverage Status

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:

importbotofromboto.s3.keyimportKeyclassMyModel(object):
def__init__(self, name, value):
self.name=nameself.value=valuedefsave(self):
conn=boto.connect_s3()
bucket=conn.get_bucket('mybucket')
k=Key(bucket)
k.key=self.namek.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:

importbotofrommotoimportmock_s3frommymoduleimportMyModel@mock_s3deftest_my_model_save():
conn=boto.connect_s3()
# We need to create the bucket since this is all in Moto's 'virtual' AWS accountconn.create_bucket('mybucket')
model_instance=MyModel('steve', 'is awesome')
model_instance.save()
assertconn.get_bucket('mybucket').get_key('steve').get_contents_as_string() =='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.

It gets even better! Moto isn't just S3. Here's the status of the other AWS services implemented.

|------------------------------------------------------------------------------|| ServiceName | Decorator | DevelopmentStatus ||------------------------------------------------------------------------------|| Autoscaling | @mock_autoscaling| coreendpointsdone ||------------------------------------------------------------------------------|| Cloudformation | @mock_cloudformation| coreendpointsdone ||------------------------------------------------------------------------------|| Cloudwatch | @mock_cloudwatch | basicendpointsdone ||------------------------------------------------------------------------------|| DataPipeline | @mock_datapipeline| basicendpointsdone ||------------------------------------------------------------------------------|| DynamoDB | @mock_dynamodb | coreendpointsdone || DynamoDB2 | @mock_dynamodb2 | coreendpointsdone - noindexes ||------------------------------------------------------------------------------|| EC2 | @mock_ec2 | coreendpointsdone || - AMI | | coreendpointsdone || - EBS | | coreendpointsdone || - Instances | | allendpointsdone || - SecurityGroups | | coreendpointsdone || - Tags | | allendpointsdone ||------------------------------------------------------------------------------|| ELB | @mock_elb | coreendpointsdone ||------------------------------------------------------------------------------|| EMR | @mock_emr | coreendpointsdone ||------------------------------------------------------------------------------|| Glacier | @mock_glacier | coreendpointsdone ||------------------------------------------------------------------------------|| IAM | @mock_iam | coreendpointsdone ||------------------------------------------------------------------------------|| Kinesis | @mock_kinesis | coreendpointsdone ||------------------------------------------------------------------------------|| RDS | @mock_rds | coreendpointsdone ||------------------------------------------------------------------------------|| RDS2 | @mock_rds2 | coreendpointsdone ||------------------------------------------------------------------------------|| Redshift | @mock_redshift | coreendpointsdone ||------------------------------------------------------------------------------|| Route53 | @mock_route53 | coreendpointsdone ||------------------------------------------------------------------------------|| S3 | @mock_s3 | coreendpointsdone ||------------------------------------------------------------------------------|| SES | @mock_ses | coreendpointsdone ||------------------------------------------------------------------------------|| SNS | @mock_sns | coreendpointsdone ||------------------------------------------------------------------------------|| SQS | @mock_sqs | coreendpointsdone ||------------------------------------------------------------------------------|| STS | @mock_sts | coreendpointsdone ||------------------------------------------------------------------------------|

Another Example

Imagine you have a function that you use to launch new ec2 instances:

importbotodefadd_servers(ami_id, count):
conn=boto.connect_ec2('the_key', 'the_secret')
forindexinrange(count):
conn.run_instances(ami_id)

To test it:

from . importadd_servers@mock_ec2deftest_add_servers():
add_servers('ami-1234abcd', 2)
conn=boto.connect_ec2('the_key', 'the_secret')
reservations=conn.get_all_instances()
assertlen(reservations) ==2instance1=reservations[0].instances[0]
assertinstance1.image_id=='ami-1234abcd'

Usage

All of the services can be used as a decorator, context manager, or in a raw form.

Decorator

@mock_s3deftest_my_model_save():
conn=boto.connect_s3()
conn.create_bucket('mybucket')
model_instance=MyModel('steve', 'is awesome')
model_instance.save()
assertconn.get_bucket('mybucket').get_key('steve').get_contents_as_string() =='is awesome'

Context Manager

deftest_my_model_save():
withmock_s3():
conn=boto.connect_s3()
conn.create_bucket('mybucket')
model_instance=MyModel('steve', 'is awesome')
model_instance.save()
assertconn.get_bucket('mybucket').get_key('steve').get_contents_as_string() =='is awesome'

Raw use

deftest_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()
assertconn.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 mode. This allows you to utilize the backend structure of Moto even if you don't use Python.

To run a service:

$ moto_server ec2 * Running on http://0.0.0.0:5000/

You can also pass the port as the second argument:

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

Then go to localhost to see a list of running instances (it will be empty since you haven't added any yet).

If you want to use boto with this (using the simpler decorators above instead is strongly encouraged), the easiest way is to create a boto config file (~/.boto) with the following values:

[Boto]
is_secure = False
https_validate_certificates = False
proxy_port = 5000
proxy = 127.0.0.1

Install

$ pip install moto

Thanks

A huge thanks to Gabriel Falcão and his HTTPretty library. Moto would not exist without it.

About

Moto is a library that allows your python tests to easily mock out the boto library

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - behanceops/moto: Moto is a library that allows your python tests to easily mock out the boto library · GitHub
Skip to content

Repository files navigation

Moto - Mock Boto

Build StatusCoverage Status

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:

importbotofromboto.s3.keyimportKeyclassMyModel(object):
def__init__(self, name, value):
self.name=nameself.value=valuedefsave(self):
conn=boto.connect_s3()
bucket=conn.get_bucket('mybucket')
k=Key(bucket)
k.key=self.namek.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:

importbotofrommotoimportmock_s3frommymoduleimportMyModel@mock_s3deftest_my_model_save():
conn=boto.connect_s3()
# We need to create the bucket since this is all in Moto's 'virtual' AWS accountconn.create_bucket('mybucket')
model_instance=MyModel('steve', 'is awesome')
model_instance.save()
assertconn.get_bucket('mybucket').get_key('steve').get_contents_as_string() =='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.

It gets even better! Moto isn't just S3. Here's the status of the other AWS services implemented.

|------------------------------------------------------------------------------|| ServiceName | Decorator | DevelopmentStatus ||------------------------------------------------------------------------------|| Autoscaling | @mock_autoscaling| coreendpointsdone ||------------------------------------------------------------------------------|| Cloudformation | @mock_cloudformation| coreendpointsdone ||------------------------------------------------------------------------------|| Cloudwatch | @mock_cloudwatch | basicendpointsdone ||------------------------------------------------------------------------------|| DataPipeline | @mock_datapipeline| basicendpointsdone ||------------------------------------------------------------------------------|| DynamoDB | @mock_dynamodb | coreendpointsdone || DynamoDB2 | @mock_dynamodb2 | coreendpointsdone - noindexes ||------------------------------------------------------------------------------|| EC2 | @mock_ec2 | coreendpointsdone || - AMI | | coreendpointsdone || - EBS | | coreendpointsdone || - Instances | | allendpointsdone || - SecurityGroups | | coreendpointsdone || - Tags | | allendpointsdone ||------------------------------------------------------------------------------|| ELB | @mock_elb | coreendpointsdone ||------------------------------------------------------------------------------|| EMR | @mock_emr | coreendpointsdone ||------------------------------------------------------------------------------|| Glacier | @mock_glacier | coreendpointsdone ||------------------------------------------------------------------------------|| IAM | @mock_iam | coreendpointsdone ||------------------------------------------------------------------------------|| Kinesis | @mock_kinesis | coreendpointsdone ||------------------------------------------------------------------------------|| RDS | @mock_rds | coreendpointsdone ||------------------------------------------------------------------------------|| RDS2 | @mock_rds2 | coreendpointsdone ||------------------------------------------------------------------------------|| Redshift | @mock_redshift | coreendpointsdone ||------------------------------------------------------------------------------|| Route53 | @mock_route53 | coreendpointsdone ||------------------------------------------------------------------------------|| S3 | @mock_s3 | coreendpointsdone ||------------------------------------------------------------------------------|| SES | @mock_ses | coreendpointsdone ||------------------------------------------------------------------------------|| SNS | @mock_sns | coreendpointsdone ||------------------------------------------------------------------------------|| SQS | @mock_sqs | coreendpointsdone ||------------------------------------------------------------------------------|| STS | @mock_sts | coreendpointsdone ||------------------------------------------------------------------------------|

Another Example

Imagine you have a function that you use to launch new ec2 instances:

importbotodefadd_servers(ami_id, count):
conn=boto.connect_ec2('the_key', 'the_secret')
forindexinrange(count):
conn.run_instances(ami_id)

To test it:

from . importadd_servers@mock_ec2deftest_add_servers():
add_servers('ami-1234abcd', 2)
conn=boto.connect_ec2('the_key', 'the_secret')
reservations=conn.get_all_instances()
assertlen(reservations) ==2instance1=reservations[0].instances[0]
assertinstance1.image_id=='ami-1234abcd'

Usage

All of the services can be used as a decorator, context manager, or in a raw form.

Decorator

@mock_s3deftest_my_model_save():
conn=boto.connect_s3()
conn.create_bucket('mybucket')
model_instance=MyModel('steve', 'is awesome')
model_instance.save()
assertconn.get_bucket('mybucket').get_key('steve').get_contents_as_string() =='is awesome'

Context Manager

deftest_my_model_save():
withmock_s3():
conn=boto.connect_s3()
conn.create_bucket('mybucket')
model_instance=MyModel('steve', 'is awesome')
model_instance.save()
assertconn.get_bucket('mybucket').get_key('steve').get_contents_as_string() =='is awesome'

Raw use

deftest_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()
assertconn.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 mode. This allows you to utilize the backend structure of Moto even if you don't use Python.

To run a service:

$ moto_server ec2 * Running on http://0.0.0.0:5000/

You can also pass the port as the second argument:

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

Then go to localhost to see a list of running instances (it will be empty since you haven't added any yet).

If you want to use boto with this (using the simpler decorators above instead is strongly encouraged), the easiest way is to create a boto config file (~/.boto) with the following values:

[Boto]
is_secure = False
https_validate_certificates = False
proxy_port = 5000
proxy = 127.0.0.1

Install

$ pip install moto

Thanks

A huge thanks to Gabriel Falcão and his HTTPretty library. Moto would not exist without it.

About

Moto is a library that allows your python tests to easily mock out the boto library

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - behanceops/moto: Moto is a library that allows your python tests to easily mock out the boto library · GitHub
Skip to content

Repository files navigation

Moto - Mock Boto

Build StatusCoverage Status

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:

importbotofromboto.s3.keyimportKeyclassMyModel(object):
def__init__(self, name, value):
self.name=nameself.value=valuedefsave(self):
conn=boto.connect_s3()
bucket=conn.get_bucket('mybucket')
k=Key(bucket)
k.key=self.namek.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:

importbotofrommotoimportmock_s3frommymoduleimportMyModel@mock_s3deftest_my_model_save():
conn=boto.connect_s3()
# We need to create the bucket since this is all in Moto's 'virtual' AWS accountconn.create_bucket('mybucket')
model_instance=MyModel('steve', 'is awesome')
model_instance.save()
assertconn.get_bucket('mybucket').get_key('steve').get_contents_as_string() =='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.

It gets even better! Moto isn't just S3. Here's the status of the other AWS services implemented.

|------------------------------------------------------------------------------|| ServiceName | Decorator | DevelopmentStatus ||------------------------------------------------------------------------------|| Autoscaling | @mock_autoscaling| coreendpointsdone ||------------------------------------------------------------------------------|| Cloudformation | @mock_cloudformation| coreendpointsdone ||------------------------------------------------------------------------------|| Cloudwatch | @mock_cloudwatch | basicendpointsdone ||------------------------------------------------------------------------------|| DataPipeline | @mock_datapipeline| basicendpointsdone ||------------------------------------------------------------------------------|| DynamoDB | @mock_dynamodb | coreendpointsdone || DynamoDB2 | @mock_dynamodb2 | coreendpointsdone - noindexes ||------------------------------------------------------------------------------|| EC2 | @mock_ec2 | coreendpointsdone || - AMI | | coreendpointsdone || - EBS | | coreendpointsdone || - Instances | | allendpointsdone || - SecurityGroups | | coreendpointsdone || - Tags | | allendpointsdone ||------------------------------------------------------------------------------|| ELB | @mock_elb | coreendpointsdone ||------------------------------------------------------------------------------|| EMR | @mock_emr | coreendpointsdone ||------------------------------------------------------------------------------|| Glacier | @mock_glacier | coreendpointsdone ||------------------------------------------------------------------------------|| IAM | @mock_iam | coreendpointsdone ||------------------------------------------------------------------------------|| Kinesis | @mock_kinesis | coreendpointsdone ||------------------------------------------------------------------------------|| RDS | @mock_rds | coreendpointsdone ||------------------------------------------------------------------------------|| RDS2 | @mock_rds2 | coreendpointsdone ||------------------------------------------------------------------------------|| Redshift | @mock_redshift | coreendpointsdone ||------------------------------------------------------------------------------|| Route53 | @mock_route53 | coreendpointsdone ||------------------------------------------------------------------------------|| S3 | @mock_s3 | coreendpointsdone ||------------------------------------------------------------------------------|| SES | @mock_ses | coreendpointsdone ||------------------------------------------------------------------------------|| SNS | @mock_sns | coreendpointsdone ||------------------------------------------------------------------------------|| SQS | @mock_sqs | coreendpointsdone ||------------------------------------------------------------------------------|| STS | @mock_sts | coreendpointsdone ||------------------------------------------------------------------------------|

Another Example

Imagine you have a function that you use to launch new ec2 instances:

importbotodefadd_servers(ami_id, count):
conn=boto.connect_ec2('the_key', 'the_secret')
forindexinrange(count):
conn.run_instances(ami_id)

To test it:

from . importadd_servers@mock_ec2deftest_add_servers():
add_servers('ami-1234abcd', 2)
conn=boto.connect_ec2('the_key', 'the_secret')
reservations=conn.get_all_instances()
assertlen(reservations) ==2instance1=reservations[0].instances[0]
assertinstance1.image_id=='ami-1234abcd'

Usage

All of the services can be used as a decorator, context manager, or in a raw form.

Decorator

@mock_s3deftest_my_model_save():
conn=boto.connect_s3()
conn.create_bucket('mybucket')
model_instance=MyModel('steve', 'is awesome')
model_instance.save()
assertconn.get_bucket('mybucket').get_key('steve').get_contents_as_string() =='is awesome'

Context Manager

deftest_my_model_save():
withmock_s3():
conn=boto.connect_s3()
conn.create_bucket('mybucket')
model_instance=MyModel('steve', 'is awesome')
model_instance.save()
assertconn.get_bucket('mybucket').get_key('steve').get_contents_as_string() =='is awesome'

Raw use

deftest_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()
assertconn.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 mode. This allows you to utilize the backend structure of Moto even if you don't use Python.

To run a service:

$ moto_server ec2 * Running on http://0.0.0.0:5000/

You can also pass the port as the second argument:

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

Then go to localhost to see a list of running instances (it will be empty since you haven't added any yet).

If you want to use boto with this (using the simpler decorators above instead is strongly encouraged), the easiest way is to create a boto config file (~/.boto) with the following values:

[Boto]
is_secure = False
https_validate_certificates = False
proxy_port = 5000
proxy = 127.0.0.1

Install

$ pip install moto

Thanks

A huge thanks to Gabriel Falcão and his HTTPretty library. Moto would not exist without it.

About

Moto is a library that allows your python tests to easily mock out the boto library

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - behanceops/moto: Moto is a library that allows your python tests to easily mock out the boto library · GitHub
Skip to content

Repository files navigation

Moto - Mock Boto

Build StatusCoverage Status

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:

importbotofromboto.s3.keyimportKeyclassMyModel(object):
def__init__(self, name, value):
self.name=nameself.value=valuedefsave(self):
conn=boto.connect_s3()
bucket=conn.get_bucket('mybucket')
k=Key(bucket)
k.key=self.namek.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:

importbotofrommotoimportmock_s3frommymoduleimportMyModel@mock_s3deftest_my_model_save():
conn=boto.connect_s3()
# We need to create the bucket since this is all in Moto's 'virtual' AWS accountconn.create_bucket('mybucket')
model_instance=MyModel('steve', 'is awesome')
model_instance.save()
assertconn.get_bucket('mybucket').get_key('steve').get_contents_as_string() =='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.

It gets even better! Moto isn't just S3. Here's the status of the other AWS services implemented.

|------------------------------------------------------------------------------|| ServiceName | Decorator | DevelopmentStatus ||------------------------------------------------------------------------------|| Autoscaling | @mock_autoscaling| coreendpointsdone ||------------------------------------------------------------------------------|| Cloudformation | @mock_cloudformation| coreendpointsdone ||------------------------------------------------------------------------------|| Cloudwatch | @mock_cloudwatch | basicendpointsdone ||------------------------------------------------------------------------------|| DataPipeline | @mock_datapipeline| basicendpointsdone ||------------------------------------------------------------------------------|| DynamoDB | @mock_dynamodb | coreendpointsdone || DynamoDB2 | @mock_dynamodb2 | coreendpointsdone - noindexes ||------------------------------------------------------------------------------|| EC2 | @mock_ec2 | coreendpointsdone || - AMI | | coreendpointsdone || - EBS | | coreendpointsdone || - Instances | | allendpointsdone || - SecurityGroups | | coreendpointsdone || - Tags | | allendpointsdone ||------------------------------------------------------------------------------|| ELB | @mock_elb | coreendpointsdone ||------------------------------------------------------------------------------|| EMR | @mock_emr | coreendpointsdone ||------------------------------------------------------------------------------|| Glacier | @mock_glacier | coreendpointsdone ||------------------------------------------------------------------------------|| IAM | @mock_iam | coreendpointsdone ||------------------------------------------------------------------------------|| Kinesis | @mock_kinesis | coreendpointsdone ||------------------------------------------------------------------------------|| RDS | @mock_rds | coreendpointsdone ||------------------------------------------------------------------------------|| RDS2 | @mock_rds2 | coreendpointsdone ||------------------------------------------------------------------------------|| Redshift | @mock_redshift | coreendpointsdone ||------------------------------------------------------------------------------|| Route53 | @mock_route53 | coreendpointsdone ||------------------------------------------------------------------------------|| S3 | @mock_s3 | coreendpointsdone ||------------------------------------------------------------------------------|| SES | @mock_ses | coreendpointsdone ||------------------------------------------------------------------------------|| SNS | @mock_sns | coreendpointsdone ||------------------------------------------------------------------------------|| SQS | @mock_sqs | coreendpointsdone ||------------------------------------------------------------------------------|| STS | @mock_sts | coreendpointsdone ||------------------------------------------------------------------------------|

Another Example

Imagine you have a function that you use to launch new ec2 instances:

importbotodefadd_servers(ami_id, count):
conn=boto.connect_ec2('the_key', 'the_secret')
forindexinrange(count):
conn.run_instances(ami_id)

To test it:

from . importadd_servers@mock_ec2deftest_add_servers():
add_servers('ami-1234abcd', 2)
conn=boto.connect_ec2('the_key', 'the_secret')
reservations=conn.get_all_instances()
assertlen(reservations) ==2instance1=reservations[0].instances[0]
assertinstance1.image_id=='ami-1234abcd'

Usage

All of the services can be used as a decorator, context manager, or in a raw form.

Decorator

@mock_s3deftest_my_model_save():
conn=boto.connect_s3()
conn.create_bucket('mybucket')
model_instance=MyModel('steve', 'is awesome')
model_instance.save()
assertconn.get_bucket('mybucket').get_key('steve').get_contents_as_string() =='is awesome'

Context Manager

deftest_my_model_save():
withmock_s3():
conn=boto.connect_s3()
conn.create_bucket('mybucket')
model_instance=MyModel('steve', 'is awesome')
model_instance.save()
assertconn.get_bucket('mybucket').get_key('steve').get_contents_as_string() =='is awesome'

Raw use

deftest_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()
assertconn.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 mode. This allows you to utilize the backend structure of Moto even if you don't use Python.

To run a service:

$ moto_server ec2 * Running on http://0.0.0.0:5000/

You can also pass the port as the second argument:

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

Then go to localhost to see a list of running instances (it will be empty since you haven't added any yet).

If you want to use boto with this (using the simpler decorators above instead is strongly encouraged), the easiest way is to create a boto config file (~/.boto) with the following values:

[Boto]
is_secure = False
https_validate_certificates = False
proxy_port = 5000
proxy = 127.0.0.1

Install

$ pip install moto

Thanks

A huge thanks to Gabriel Falcão and his HTTPretty library. Moto would not exist without it.

About

Moto is a library that allows your python tests to easily mock out the boto library

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - behanceops/moto: Moto is a library that allows your python tests to easily mock out the boto library · GitHub
Skip to content

Repository files navigation

Moto - Mock Boto

Build StatusCoverage Status

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:

importbotofromboto.s3.keyimportKeyclassMyModel(object):
def__init__(self, name, value):
self.name=nameself.value=valuedefsave(self):
conn=boto.connect_s3()
bucket=conn.get_bucket('mybucket')
k=Key(bucket)
k.key=self.namek.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:

importbotofrommotoimportmock_s3frommymoduleimportMyModel@mock_s3deftest_my_model_save():
conn=boto.connect_s3()
# We need to create the bucket since this is all in Moto's 'virtual' AWS accountconn.create_bucket('mybucket')
model_instance=MyModel('steve', 'is awesome')
model_instance.save()
assertconn.get_bucket('mybucket').get_key('steve').get_contents_as_string() =='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.

It gets even better! Moto isn't just S3. Here's the status of the other AWS services implemented.

|------------------------------------------------------------------------------|| ServiceName | Decorator | DevelopmentStatus ||------------------------------------------------------------------------------|| Autoscaling | @mock_autoscaling| coreendpointsdone ||------------------------------------------------------------------------------|| Cloudformation | @mock_cloudformation| coreendpointsdone ||------------------------------------------------------------------------------|| Cloudwatch | @mock_cloudwatch | basicendpointsdone ||------------------------------------------------------------------------------|| DataPipeline | @mock_datapipeline| basicendpointsdone ||------------------------------------------------------------------------------|| DynamoDB | @mock_dynamodb | coreendpointsdone || DynamoDB2 | @mock_dynamodb2 | coreendpointsdone - noindexes ||------------------------------------------------------------------------------|| EC2 | @mock_ec2 | coreendpointsdone || - AMI | | coreendpointsdone || - EBS | | coreendpointsdone || - Instances | | allendpointsdone || - SecurityGroups | | coreendpointsdone || - Tags | | allendpointsdone ||------------------------------------------------------------------------------|| ELB | @mock_elb | coreendpointsdone ||------------------------------------------------------------------------------|| EMR | @mock_emr | coreendpointsdone ||------------------------------------------------------------------------------|| Glacier | @mock_glacier | coreendpointsdone ||------------------------------------------------------------------------------|| IAM | @mock_iam | coreendpointsdone ||------------------------------------------------------------------------------|| Kinesis | @mock_kinesis | coreendpointsdone ||------------------------------------------------------------------------------|| RDS | @mock_rds | coreendpointsdone ||------------------------------------------------------------------------------|| RDS2 | @mock_rds2 | coreendpointsdone ||------------------------------------------------------------------------------|| Redshift | @mock_redshift | coreendpointsdone ||------------------------------------------------------------------------------|| Route53 | @mock_route53 | coreendpointsdone ||------------------------------------------------------------------------------|| S3 | @mock_s3 | coreendpointsdone ||------------------------------------------------------------------------------|| SES | @mock_ses | coreendpointsdone ||------------------------------------------------------------------------------|| SNS | @mock_sns | coreendpointsdone ||------------------------------------------------------------------------------|| SQS | @mock_sqs | coreendpointsdone ||------------------------------------------------------------------------------|| STS | @mock_sts | coreendpointsdone ||------------------------------------------------------------------------------|

Another Example

Imagine you have a function that you use to launch new ec2 instances:

importbotodefadd_servers(ami_id, count):
conn=boto.connect_ec2('the_key', 'the_secret')
forindexinrange(count):
conn.run_instances(ami_id)

To test it:

from . importadd_servers@mock_ec2deftest_add_servers():
add_servers('ami-1234abcd', 2)
conn=boto.connect_ec2('the_key', 'the_secret')
reservations=conn.get_all_instances()
assertlen(reservations) ==2instance1=reservations[0].instances[0]
assertinstance1.image_id=='ami-1234abcd'

Usage

All of the services can be used as a decorator, context manager, or in a raw form.

Decorator

@mock_s3deftest_my_model_save():
conn=boto.connect_s3()
conn.create_bucket('mybucket')
model_instance=MyModel('steve', 'is awesome')
model_instance.save()
assertconn.get_bucket('mybucket').get_key('steve').get_contents_as_string() =='is awesome'

Context Manager

deftest_my_model_save():
withmock_s3():
conn=boto.connect_s3()
conn.create_bucket('mybucket')
model_instance=MyModel('steve', 'is awesome')
model_instance.save()
assertconn.get_bucket('mybucket').get_key('steve').get_contents_as_string() =='is awesome'

Raw use

deftest_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()
assertconn.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 mode. This allows you to utilize the backend structure of Moto even if you don't use Python.

To run a service:

$ moto_server ec2 * Running on http://0.0.0.0:5000/

You can also pass the port as the second argument:

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

Then go to localhost to see a list of running instances (it will be empty since you haven't added any yet).

If you want to use boto with this (using the simpler decorators above instead is strongly encouraged), the easiest way is to create a boto config file (~/.boto) with the following values:

[Boto]
is_secure = False
https_validate_certificates = False
proxy_port = 5000
proxy = 127.0.0.1

Install

$ pip install moto

Thanks

A huge thanks to Gabriel Falcão and his HTTPretty library. Moto would not exist without it.

About

Moto is a library that allows your python tests to easily mock out the boto library

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - behanceops/moto: Moto is a library that allows your python tests to easily mock out the boto library · GitHub
Skip to content

Repository files navigation

Moto - Mock Boto

Build StatusCoverage Status

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:

importbotofromboto.s3.keyimportKeyclassMyModel(object):
def__init__(self, name, value):
self.name=nameself.value=valuedefsave(self):
conn=boto.connect_s3()
bucket=conn.get_bucket('mybucket')
k=Key(bucket)
k.key=self.namek.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:

importbotofrommotoimportmock_s3frommymoduleimportMyModel@mock_s3deftest_my_model_save():
conn=boto.connect_s3()
# We need to create the bucket since this is all in Moto's 'virtual' AWS accountconn.create_bucket('mybucket')
model_instance=MyModel('steve', 'is awesome')
model_instance.save()
assertconn.get_bucket('mybucket').get_key('steve').get_contents_as_string() =='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.

It gets even better! Moto isn't just S3. Here's the status of the other AWS services implemented.

|------------------------------------------------------------------------------|| ServiceName | Decorator | DevelopmentStatus ||------------------------------------------------------------------------------|| Autoscaling | @mock_autoscaling| coreendpointsdone ||------------------------------------------------------------------------------|| Cloudformation | @mock_cloudformation| coreendpointsdone ||------------------------------------------------------------------------------|| Cloudwatch | @mock_cloudwatch | basicendpointsdone ||------------------------------------------------------------------------------|| DataPipeline | @mock_datapipeline| basicendpointsdone ||------------------------------------------------------------------------------|| DynamoDB | @mock_dynamodb | coreendpointsdone || DynamoDB2 | @mock_dynamodb2 | coreendpointsdone - noindexes ||------------------------------------------------------------------------------|| EC2 | @mock_ec2 | coreendpointsdone || - AMI | | coreendpointsdone || - EBS | | coreendpointsdone || - Instances | | allendpointsdone || - SecurityGroups | | coreendpointsdone || - Tags | | allendpointsdone ||------------------------------------------------------------------------------|| ELB | @mock_elb | coreendpointsdone ||------------------------------------------------------------------------------|| EMR | @mock_emr | coreendpointsdone ||------------------------------------------------------------------------------|| Glacier | @mock_glacier | coreendpointsdone ||------------------------------------------------------------------------------|| IAM | @mock_iam | coreendpointsdone ||------------------------------------------------------------------------------|| Kinesis | @mock_kinesis | coreendpointsdone ||------------------------------------------------------------------------------|| RDS | @mock_rds | coreendpointsdone ||------------------------------------------------------------------------------|| RDS2 | @mock_rds2 | coreendpointsdone ||------------------------------------------------------------------------------|| Redshift | @mock_redshift | coreendpointsdone ||------------------------------------------------------------------------------|| Route53 | @mock_route53 | coreendpointsdone ||------------------------------------------------------------------------------|| S3 | @mock_s3 | coreendpointsdone ||------------------------------------------------------------------------------|| SES | @mock_ses | coreendpointsdone ||------------------------------------------------------------------------------|| SNS | @mock_sns | coreendpointsdone ||------------------------------------------------------------------------------|| SQS | @mock_sqs | coreendpointsdone ||------------------------------------------------------------------------------|| STS | @mock_sts | coreendpointsdone ||------------------------------------------------------------------------------|

Another Example

Imagine you have a function that you use to launch new ec2 instances:

importbotodefadd_servers(ami_id, count):
conn=boto.connect_ec2('the_key', 'the_secret')
forindexinrange(count):
conn.run_instances(ami_id)

To test it:

from . importadd_servers@mock_ec2deftest_add_servers():
add_servers('ami-1234abcd', 2)
conn=boto.connect_ec2('the_key', 'the_secret')
reservations=conn.get_all_instances()
assertlen(reservations) ==2instance1=reservations[0].instances[0]
assertinstance1.image_id=='ami-1234abcd'

Usage

All of the services can be used as a decorator, context manager, or in a raw form.

Decorator

@mock_s3deftest_my_model_save():
conn=boto.connect_s3()
conn.create_bucket('mybucket')
model_instance=MyModel('steve', 'is awesome')
model_instance.save()
assertconn.get_bucket('mybucket').get_key('steve').get_contents_as_string() =='is awesome'

Context Manager

deftest_my_model_save():
withmock_s3():
conn=boto.connect_s3()
conn.create_bucket('mybucket')
model_instance=MyModel('steve', 'is awesome')
model_instance.save()
assertconn.get_bucket('mybucket').get_key('steve').get_contents_as_string() =='is awesome'

Raw use

deftest_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()
assertconn.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 mode. This allows you to utilize the backend structure of Moto even if you don't use Python.

To run a service:

$ moto_server ec2 * Running on http://0.0.0.0:5000/

You can also pass the port as the second argument:

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

Then go to localhost to see a list of running instances (it will be empty since you haven't added any yet).

If you want to use boto with this (using the simpler decorators above instead is strongly encouraged), the easiest way is to create a boto config file (~/.boto) with the following values:

[Boto]
is_secure = False
https_validate_certificates = False
proxy_port = 5000
proxy = 127.0.0.1

Install

$ pip install moto

Thanks

A huge thanks to Gabriel Falcão and his HTTPretty library. Moto would not exist without it.

About

Moto is a library that allows your python tests to easily mock out the boto library

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages