AWS Developer Tools Blog
Client Response Stubs
We recently added client response stubs to the aws-sdk-core
gem. Response stubbing disables network traffic and causes a client to return fake or stubbed data.
# no API calls are made s3 = Aws::S3::Client.new(stub_responses: true) s3.list_buckets.buckets.map(&:name) #=> []
Custom Response Data
By default, stubbed responses return empty lists, empty maps, and placeholder scalars. These empty responses can be useful at times, but often you want to control the data returned.
s3.stub_responses(:list_buckets, buckets:[{name:'aws-sdk'}]) s3.list_buckets.buckets.map(&:name) #=> ['aws-sdk']
Safe Stubbing
One of the common risks when writing tests with stub data is that the stub doesn’t match the shape of the actual response. You risk coding against stubs that provide methods that won’t exist out of your tests.
We resolve this issue by validating your stub data hash against the model of the API. An ArgumentError
is raised when calling #stub_responses
with invalid data.
s3.stub_resposnes(:list_buckets, buckets:['aws-sdk']) #=> raises ArgumentError, "expected params[:buckets][0] to be a hash"
Stubbing Multiple Calls
By calling #stub_responses with an operation name and stub data, the client will serve that data for each call. You can specify multiple responses, and they will be used in sequence.
s3.stub_responses(:list_buckets, { buckets:[{name:'aws-sdk'}] }, { buckets:[{name:'aws-sdk', 'aws-sdk-2'}] } ) s3.list_buckets.buckets.map(&:name) #=> ['aws-sdk'] s3.list_buckets.buckets.map(&:name) #=> ['aws-sdk', 'aws-sdk-2']
Stubbing Errors
In addition to stubbing response data, you can configure errors to raise. You can specify a service error by name, or you can provide an error object or class to raise.
# everything is broken s3.stub_responses(:head_bucket, 'NotFound' Timeout::Error, RuntimeError.new('oops') ) s3.head_bucket(bucket:'aws-sdk') # raises Aws::S3::Errors::NotFound s3.head_bucket(bucket:'aws-sdk') # raises a new Timeout::Error s3.head_bucket(bucket:'aws-sdk') # raises RuntimeError.new('oops')
You can mix stubbed response data and errors. This approach is great when you want to test how well your code recovers from errors.
Stubbing All Clients
The default config can be used to enable client stubbing globally. This can be very useful when writing tests to enable stubbing in your test helper once.
# stub everything Aws.config[:stub_responses] = true
Give it a try and let us know what you think.