3/29/2012

やっぱり Mocktra は便利だった!

先月、「Mocktra がやばいやばいやばい」で紹介した Mocktra を最近使っているけど、やっぱり便利だった。

いま僕やってることは、ウェブページのスクレイピングみたいなことをするライブラリの作成で、そのテストの場面で Mocktra が大活躍。

テストフレームワークは RSpec をつかってて、プロジェクトのディレクトリ直下には lib と spec のディレクトリがある感じ。lib ディレクトリの下にライブラリの実装をいれていって、spec ディレクトリの下にテストコードをいれていく。spec ディレクトリには各テストコードに共通の内容が入った spec_helper.rb がある。ここで Mocktra を使ってる。あと、spec ディレクトリの下に data ディレクトリをいれて、ここにスクレイピングする対象の HTML ファイルを配置する。

それで、spec_helper.rb の中で
require 'mocktra'

Mocktra('www.example.com') do
  get '/hoge'
    case param[:fuga]
    when "piyo"
      File.read(File.join("spec", "data", "piyo.html"))
    end
  end
end
て感じのことをしてる。細かいところは間違ってるかもだけど、要は、これだけのコードで、http://www.example.com/hoge?huga=piyo がアクセスされたら spec/data の下にある piyo.html を返すウェブサーバの代わりをしてくれるんだ。すごいよ、ほんと、いいタイミングすばらしいライブラリに出会った。。

通信エラー時のテストをやろうと思って、どうやってやるんだ?ということで Mocktra の中身を見てみたら、WebMock てのをベースにしてるだねー。で、Mocktra の README.md の以下の NOTICE のこともなんとなくわかった。
Mocktra calls WebMock.allow_net_connect! when loading.
で、通信エラーの件は、WebMock だと表現できないのかな、ということで、ライブラリ内で使ってる HTTPClient の HTTPClient#get (だったかな)をテストコードの直前でオーバーライドして、目的の例外、たとえば TimeoutError を raise するようにした。     

ところで、こないだのブログ記事で
記事を RubyFlow に投稿してくれた、jugyo さん、ありがとう!!!
て書いたけど、 実は、jugyo さんは Mocktra の作者じゃん!あらためて、jugyo さん、Mocktra を作ってくださってありがとうございまーす!


0 件のコメント:

コメントを投稿