tl;dr
AWS SDK for Ruby では、擬似的な値でレスポンスを返すスタブレスポンスがサポートされている。
度々、スタブレスポンスを利用したテストを書こうとすると、書き方を忘れて右往左往してしまうので、メモしておく。
サンプル
ディレクトリ構成
ディレクトリ構成は以下の通り。
$ 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
いい感じ。
以上
また、いつか、同じ内容を書くかもしれないけど、勉強になった。