ようへいの日々精進XP

よかろうもん

AWS SDK for Ruby でスタブレスポンスを利用して minitest する

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.namehosted.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

いい感じ。

以上

また、いつか、同じ内容を書くかもしれないけど、勉強になった。