rspec 云々確認など

Ruby のリハビリだったりします。しかも何故か aws-sdk だったりして。
あまり巨大なのはアレなので lib/aws/route_53.rb あたりを起点に。
rspec てきなポイントとして

  • describe はテストする対象
  • context はテストする時の状況

とか、以下な記述があって

      let(:handler) { double('handler', :handle => nil) }
  • double て二値? とか思ったら

みたいな微妙なオチとか、以下なアレゲな mock があったりなど

  • lib/*/*client.rb なナニは yaml で規定されたレスポンスを戻す形をシミュレイトするクラス定義になっている模様

色々と魔窟みたい。

なんとなく読めそげ

ということで確認してみます。

module AWS
  class Route53
    describe Client do

      let(:credentials) {{
        :access_key_id => 'akid',
        :secret_access_key => 'secret'
      }}

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

      let(:config) {
        AWS.config.with(credentials.merge(:http_handler => handler))
      }

ええと、AWS.config.with にマージした辞書を渡している、というのは分かります。詳細はスルー。このへんも基本スルーですが

      let(:client) { config.route_53_client }

      let(:now) { Time.now }

      let(:namespace) {
        'xmlns="https://route53.amazonaws.com/doc/2012-02-29/"'
      }

config.route_53_client というあたりがアレ。route_53_client というシンボルは features/route_53/route_53.rb で以下な記述があります。

Before("@route_53") do

  @route_53 = AWS::Route53.new
  @route_53_client = @route_53.client

  @created_hosted_zone_ids = []

end

う、config.route_53_client って lib/aws/route_53/client.rb と勝手読みしてるんですが繋がらぬ。とりあえずこれでヨシ、ってことにしとく。
ええと、

  • lib/aws/route_53/config.rb に以下な記述あり
AWS::Core::Configuration.module_eval do

  add_service 'Route53', 'route_53', 'route53.amazonaws.com'

end
  • lib/aws/core/configuration.rb に add_service というメソド定義があって、route_53_client というシンボルを生成している風に見えます
    • 生成してるシンボルは設定オプション?
  • ぬ、 features/route_53/route_53.rb の @route_53_client とは話が違うのか
    • でも、AWS::Route53 なオブジェクトを生成したら client という属性から yaml で定義されたソレにアクセスしているな

ええと、features/route_53/route_53.rb 見れば route_53_client は AWS::Route53 なオブジェクトの client な属性が代入されてます。
あ、これはこれで良いのか。client というシンボルはそれを参照してるということで。

もう少し

一つめの試験 (?) になるのかな。#change_resource_record_sets というメソドなコンテキストで共通な option に let して

      context '#change_resource_record_sets' do

        let(:options) {{
          :hosted_zone_id => "zone-id",
          :change_batch => {
            :changes => [
              {
                :action => 'CREATE',
                :resource_record_set => {
                  # order of hash keys purposefully jumbled to test
                  # xml member ordering
                  :ttl => 3600,
                  :resource_records => [
                    { :value => 'value1' },
                  ],
                  :type => 'CNAME',
                  :name => 'sub.domain.com',
                },
              },
            ]
          }
        }}

以下なことしてるんですが

        it 'makes a POST request' do
          handler.should_receive(:handle) do |req,resp|
            req.http_method.should eq("POST")
            req.uri.should eq('/2012-02-29/hostedzone/zone-id/rrset/')
            req.body.xml_cleanup.should eq(<<-XML.xml_cleanup)

should_receive て何かな。ええと、handler (double で作ったモック) は handle メソドを呼び出されること、なのか。引用してないけど

  • handle メソドを呼び出すなかで
    • req.http_method は 'POST' であること
    • req.uri は (略
    • req.body.xml_cleanup は (略
    • で、引用してないけど試験対象のメソド呼びます

という事なのかなぁ。最後の

          end
          client.change_resource_record_sets(options)
        end

は謎。これ前提でこの先確認してみます。ドキュメントとしての可読性がどこまでアレなのかも含め云々してみます。

ちなみに

rake が動きはじめるまでに、自分の手元の環境だと以下な命令を実行してます。rbenv で ruby 1.9.3 入れてます。

$ gem install uuidtools --no-ri --no-rdoc
$ gem install rotp -v 1.3.0 --no-ri --no-rdoc
$ gem install rvm-tester --no-ri --no-rdoc
$ gem install httparty --no-ri --no-rdoc
$ gem install nokogiri --no-ri --no-rdoc
$ gem install net-ssh --no-ri --no-rdoc
$ gem install simplecov --no-ri --no-rdoc
$ gem install yard --no-ri --no-rdoc
$ gem install rspec --no-ri --no-rdoc
$ gem install multipart-post --no-ri --no-rdoc
$ gem install cucumber -v 0.10.2 --no-ri --no-rdoc
$ gem install bourne -v 1.0 --no-ri --no-rdoc

また、上記導入中 (nokogiri だったはず) 以下パケジを導入。

  • libxml2-dev 導入
  • libxslt1-dev 導入