先月、「
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 を作ってくださってありがとうございまーす!