APIを直接使わずにアクセスの部分をすべてラッピングする
あとはフラグがなにかでテストモードかそうでないかを
判断する。ラッピング関数はそのフラグをみて、ダミーのデータを
返却する。
こんなのでうまくいくかどうかは自信がないが、
うまく言ったこともあった。
ありがとうございます。なるほどそういう方法もありますね。後出しで申し訳ないのですが、クライアントライブラリのコードには手を入れずにテストできるようにしたいので、今回は別の手段を模索します。すみません。
railsのテストでも使っているらしいmochaはいかがでしょう。
例えば、以下のようなテストコードで書けるようです。
class TestMyProduct < TestUnit::TestCase def setup xml = REXML::Document.new File.read("data/sample.xml") MyAgent.expect(:get).return(xml) end def test_xxx ..
で、プロダクション。
class MyProduction def xxx result = MyAgent.get("http://example.com/api/hoge") ... end end
この場合、Net::HTTPを使ってアクセスする部分のラッパMyAgentを(できるだけシンプルに)書き、それをモックする形で使用してます。
モックを返すモックを返すモック、、、とかを作ろうとするとさすがに泣けるので。
あと私は、普段はRSpecのモック/スタブを使ってるからです。
テストコードがtest/unitとまったく違うので既存分への適用は難しいと思いますが、興味があるようでしたらお試しください。
こちらはモックやスタブ機能を含めた統合BDDフレームワークです
書き方が面白いですね。ちょっと試してみます。ありがとうございます。
環境というのは具体的にどういう意味でしょうか。
質問が曖昧でしたかね。すみません。
例えばYahoo!の日本語形態素解析Webサービスのクライアントライブラリを作るとします
(今作っているのは別ですが)。
http://developer.yahoo.co.jp/jlp/MAService/V1/parse.html
Net::HTTPとREXMLを使えばできますけど、
XMLをパースして必要な値を取り出す部分が面倒なので、
そこを面倒みてくれるライブラリ化します。
ウェブサービスAPIのクライアントライブラリは大体同じです。
そのライブラリのユニットテストを書くわけですが、
テストを実行するたびにリクエストURL(http://api.jlp.yahoo.co.jp/MAService/V1/parse)に
アクセスせずに済ませたいと思っています。
クライアントライブラリには手を入れずに実現したいので、
Net::HTTPを差し替えて実際にネットワークアクセスをせずに
ダミーデータを返すようなのがあればと思いました。
と、ここまで書いて「ローカルに環境をインストール」から思いついたのですが、
WEBrickでダミーデータを返すウェブサーバを書いて、テスト時に稼動させればよいですね。