aws-sdk の spec 読んでみる

ちょい一発目のソレが長いので二発目のナニを引用してみます。

        it 'strips the /hostedzone/ prefix from the :hosted_zone_id param' do
          options[:hosted_zone_id] = '/hostedzone/zone-id'
          handler.should_receive(:handle) do |req,resp|
            req.uri.should eq('/2012-02-29/hostedzone/zone-id/rrset/')
          end
          client.change_resource_record_sets(options)
        end

これ、rspec てきにどーゆー意味なんでしょ。ということで諸々確認。
まず、lib/aws/api_config/Route53-2012-02-29.yml 確認。根拠は lib/aws/route_53/client.rb の以下のソレです。

module AWS
  class Route53

    # Client class for Route53.
    class Client < Core::RESTClient

      define_client_methods('2012-02-29')

で、ラッキーなことに yaml の先頭あたりに change_resource_record_sets な記述があります。

  :method: :change_resource_record_sets
  :http:
    :verb: POST
    :uri: /2012-02-29/hostedzone/:hosted_zone_id/rrset/

む、uri なソレの :hosted_zone_id がオプション指定した以下と置き換えなのか。

          options[:hosted_zone_id] = '/hostedzone/zone-id'

で、/hostedzone/ がカブッてるので strip、というのが it に渡されてる文字列のソレなのかどうなのか。つうか

          handler.should_receive(:handle) do |req,resp|
            req.uri.should eq('/2012-02-29/hostedzone/zone-id/rrset/')
          end
          client.change_resource_record_sets(options)

のあたりの意味が分からぬ。ええと、handler は以下な let で、なのか。

      let(:handler) { double('handler', :handle => nil) }

昨日エントリな記述によれば mock を作って、という形。うーん、ちょっと勝手読みしてみると

options が設定された形で client.change_resource_record_sets が呼び出された時に handler の handle メソドが req および resp が渡されて呼び出されるべきで、その時に引数 req の uri メソドはこうなっているべき

てことなのかなぁ。なんとなく違う気もするんですがorz

あってた

ええ? まぢですか。つうかそれ以外には無いっちゃ無いんですが。これで読むスピード上がりますね。
ええと、aws-sdk の試験なパターンとしては

  • describe でテスツするクラス (テスト対象としての)
  • context でテスツするメソド (テストする時の状況としての)
  • let で describe の中で global なシンボルの初期設定
  • RESTClient を継承したクラスの試験の場合、試験対象のメソドを呼び出した結果、mock として double したソレの handle というメソドが呼び出されていることを確認している
    • そこに渡される req および resp なオブジェクトの挙動を確認する形で確認

ということになっている模様。おそらくは他のパターンもあるはず。

つーかこれ

読めるようになったら色々な意味でアレですな。