Rails 難しい

v0.9 あたりの人が再度参入するための壁が高いのなんの。今のところ、model を ActiveResource を継承する形にして spec がほぼ全部 (一部 pending あり) パスというあたりまで何とかなったのですが、とりあえず既存の試験は stab を使って無理矢理通してる、という理解で良いのかどうなのか。

最初

ActiveResource::HttpMock 使って云々、というあたりでもがいていたのですが、そもそもデフォで用意される試験とか読んどかないとマズいよね、というあたりでなんとなく確認してたら、記述をそちらに合わせれば良いじゃないですか、ということに気づいた次第でして。
なので scaffold して作成される試験を一通り確認した方が良い模様。見ていきながら気付いたことをたらたらと列挙してみます。

GET なソレには識別子が付くのか

spec/requests/ 配下の spec に以下な記述があり

      get cloud_stack_apis_path

これが find |xargs grep とかしても出てこなかったので ? って思っていたのですが、rake routes してみたら出てきました。

$ rake routes
    cloud_stack_apis GET    /cloud_stack_apis(.:format)          {:action=>"index", :controller=>"cloud_stack_apis"}
                     POST   /cloud_stack_apis(.:format)          {:action=>"create", :controller=>"cloud_stack_apis"}
 new_cloud_stack_api GET    /cloud_stack_apis/new(.:format)      {:action=>"new", :controller=>"cloud_stack_apis"}
edit_cloud_stack_api GET    /cloud_stack_apis/:id/edit(.:format) {:action=>"edit", :controller=>"cloud_stack_apis"}
     cloud_stack_api GET    /cloud_stack_apis/:id(.:format)      {:action=>"show", :controller=>"cloud_stack_apis"}
                     PUT    /cloud_stack_apis/:id(.:format)      {:action=>"update", :controller=>"cloud_stack_apis"}
                     DELETE /cloud_stack_apis/:id(.:format)      {:action=>"destroy", :controller=>"cloud_stack_apis"}
$

しかしこの spec/request 配下の試験って一体何のためにあるのだろうか、と。

統合テスツらしい

なんだか色々と凄い。とは言えとりあえずここは置いておきます。

mock_model 手続き

controller な spec にある以下な手続き。

  def mock_cloud_stack_api(stubs={})
    @mock_cloud_stack_api ||= mock_model(CloudStackApi, stubs).as_null_object
  end

as_null_object って何でしょ。以下によれば

特定のメソド呼び出し以外を無視したい云々な話が出てます。自分もどこかで無指定だったら全てのメソドはそのオブジェクト自身を戻す形になる、という記述を見た記憶あり。
そーゆー意味では適当なオブジェクト作って、メソド呼び出しには無反応、というのが上記手続きの記述なのかな。
つーか、おそらくイマイチ mock というナニの理解が微妙なはず。

stub

例えば以下な spec が作られてます。

  describe "GET index" do
    it "assigns all cloud_stack_apis as @cloud_stack_apis" do
      CloudStackApi.stub(:all) { [mock_cloud_stack_api] }
      get :index
      assigns(:cloud_stack_apis).should eq([mock_cloud_stack_api])
    end
  end

mock もですが stub もあまり良く分かってないな。ちなみに controller の index な記述が以下で

  def index
    @cloud_stack_apis = CloudStackApi.all

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @cloud_stack_apis }
    end
  end

単純に @cloud_stack_apis の中身を確認してるだけ、という事なのか。とりあえず、デフォで作成される spec で使われてる mock あるいは stub はどちらも同じ扱い (?) に見えます。本来なら mock はもう少しきちんとした用途がある (i/f の確認) みたいですが。

view の試験は

明日確認の方向。明日はどこまで進めることができるのかorz