tl;dr
AWS SDK for Ruby では、擬似的な値でレスポンスを返すスタブレスポンスがサポートされている。
docs.aws.amazon.com
度々、スタブレスポンスを利用したテストを書こうとすると、書き方を忘れて右往左往してしまうので、メモしておく。
サンプル
ディレクトリ構成は以下の通り。
$ tree . -L 2
.
├── Gemfile
├── Gemfile.lock
├── Rakefile
├── sample.rb
├── stub
│ └── route53.rb
├── test
│ └── sample_test.rb
└── vendor
└── bundle
6 directories, 20 files
サンプルコード
サンプルコード (sample.rb) は以下の通り。
require 'aws-sdk'
def r53
r53 ||= Aws::Route53::Client.new
end
def domain_name(hosted_zone_id)
r53.get_hosted_zone(id: hosted_zone_id).hosted_zone.name
end
これは、Route53 の Hosted Zone ID を引数に渡すと、ドメイン名を返す超簡単なコード。
サンプルのテストコード
サンプルのテストコード (test/sample_test.rb) は以下の通り。minitest を利用する。
require_relative '../sample.rb'
require_relative '../stub/route53.rb'
require 'minitest/autorun'
require 'minitest/reporters'
Minitest::Reporters.use! [Minitest::Reporters::SpecReporter.new]
class TestHandler < Minitest::Test
def setup
Aws.config[:stub_responses] = true
end
def test_domain_name
expect = 'example.com'
assert_equal expect, domain_name('xxxxxxxxxxxxxxxx')
end
end
domain_name
メソッドは、ドメイン名 (example.com
) を返してくれることを期待したコード。
肝は以下の通り。
require_relative '../stub/route53.rb'
Aws.config[:stub_responses] = true
Aws.config[:stub_responses] = true
はおまじない。require_relative '../stub/route53.rb'
に、スタブレスポンスしたい内容を書く (後述) 。
スタブレスポンスの内容
そして、スタブレスポンスの内容 (stub/route53.rb) は、以下の通り。
Aws.config[:route53] = {
stub_responses: {
get_hosted_zone: {
hosted_zone: {
id: 'xxxxxxxxxxxxxxxxxx',
name: 'example.com',
caller_reference: 'xxxxxxxxxxxxxx'
}
}
}
}
get_hosted_zone
が呼び出すメソッド名で、値として、返却したいデータを定義する。
尚、hosted.id
及び hosted.name
と hosted.caller_reference
は、スタブレスポンスでも必ずレスポンスとして返す必要のあるデータ。
一つでも欠けると以下のように ArgumentError
となる。
ArgumentError: ArgumentError: missing required parameter params[:hosted_zone][:name]
注意しよう。
動作確認
Rakefile は以下のように定義。
desc 'Execute Test'
task :test do
Dir.glob('./test/*_test.rb').each { |file| require file }
end
以下の通り、rake コマンドを実行する。
$ bundle exec rake test
Started with run options --seed 6635
TestHandler
test_domain_name PASS (0.06s)
Finished in 0.06036s
1 tests, 1 assertions, 0 failures, 0 errors, 0 skips
いい感じ。
以上
また、いつか、同じ内容を書くかもしれないけど、勉強になった。