Ruby でウェブサービス API のクライアントライブラリを作っています。テストを書こうとしてふと思ったのですが、そのままテストを書くとユニットテストを実行するたびに API にアクセスすることになります。ダミーデータを使ってテストができるように、ネットワークアクセス(HTTP)をシミュレートするモックライブラリはないでしょうか。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2007/08/31 14:30:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:sukiyaki22 No.1

回答回数299ベストアンサー獲得回数2

ポイント23pt

ふつうはローカルに環境をインストールするんではないですか?http://end

id:nuna

環境というのは具体的にどういう意味でしょうか。

質問が曖昧でしたかね。すみません。

例えば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でダミーデータを返すウェブサーバを書いて、テスト時に稼動させればよいですね。

2007/08/27 01:00:36
id:KUROX No.2

回答回数3542ベストアンサー獲得回数140

ポイント23pt

APIを直接使わずにアクセスの部分をすべてラッピングする

あとはフラグがなにかでテストモードかそうでないかを

判断する。ラッピング関数はそのフラグをみて、ダミーのデータを

返却する。

こんなのでうまくいくかどうかは自信がないが、

うまく言ったこともあった。

http://q.hatena.ne.jp/answer

id:nuna

ありがとうございます。なるほどそういう方法もありますね。後出しで申し訳ないのですが、クライアントライブラリのコードには手を入れずにテストできるようにしたいので、今回は別の手段を模索します。すみません。

2007/08/27 01:05:54
id:moro No.3

回答回数23ベストアンサー獲得回数10

ポイント22pt

http://mocha.rubyforge.org/

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とまったく違うので既存分への適用は難しいと思いますが、興味があるようでしたらお試しください。

http://rspec.rubyforge.org/

こちらはモックやスタブ機能を含めた統合BDDフレームワークです

id:nuna

書き方が面白いですね。ちょっと試してみます。ありがとうございます。

2007/08/29 22:27:17
id:minkpa No.4

回答回数4178ベストアンサー獲得回数55

id:nuna

ありがとうございます。勉強になりました。スタブとモックを混同してました……

2007/08/29 22:11:52

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません