いま僕やってることは、ウェブページのスクレイピングみたいなことをするライブラリの作成で、そのテストの場面で Mocktra が大活躍。
テストフレームワークは RSpec をつかってて、プロジェクトのディレクトリ直下には lib と spec のディレクトリがある感じ。lib ディレクトリの下にライブラリの実装をいれていって、spec ディレクトリの下にテストコードをいれていく。spec ディレクトリには各テストコードに共通の内容が入った spec_helper.rb がある。ここで Mocktra を使ってる。あと、spec ディレクトリの下に data ディレクトリをいれて、ここにスクレイピングする対象の HTML ファイルを配置する。
それで、spec_helper.rb の中で
require 'mocktra'て感じのことをしてる。細かいところは間違ってるかもだけど、要は、これだけのコードで、http://www.example.com/hoge?huga=piyo がアクセスされたら spec/data の下にある piyo.html を返すウェブサーバの代わりをしてくれるんだ。すごいよ、ほんと、いいタイミングすばらしいライブラリに出会った。。
Mocktra('www.example.com') do
get '/hoge'
case param[:fuga]
when "piyo"
File.read(File.join("spec", "data", "piyo.html"))
end
end
end
通信エラー時のテストをやろうと思って、どうやってやるんだ?ということで 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 を作ってくださってありがとうございまーす!