Ruby Freaks Lounge

第37回 実用的なダミーサーバ ww(double-web)(2)

この記事を読むのに必要な時間:およそ 4 分

期待するリクエストの内容つきでモックする

さらに,いま述べたようなリクエストの有無だけを検証するのではなく,リクエストの内容が期待するものかどうかも検証できます。リクエストの内容を検証するには,mock()メソッドの第二引数として期待するパラメータ名と値をHashで渡します。

たとえば,送信されるmessageが「こんばんは」であることを検証するには,次のように定義します。

diff --git a/spec/miniblog_client_spec.rb b/spec/miniblog_client_spec.rb
@@ -27,7 +27,7 @@ describe MiniblogClient do

  describe "#post_entry" do
    before do
-   WW::Server.mock(:miniblog).post("/messages") do
+   WW::Server.mock(:miniblog, "message" => "こんばんは").post("/messages") do
     ""

   end
   conn = Connection.new("localhost", 3080)

こうすると,@client.post_entry("moro", "こんばんは")の場合にはテストが成功し, @client.post_entry("moro", "こんにちは")と呼び出した場合にはテストが失敗するようになります。"user"パラメータについては特に検証しないため,@client.post_entry("morohashi", "こんばんは")などという呼び出しでも テストは成功します。リクエストの中で特に検証したいパラメータのみを指定するとよいでしょう。

スパイのリクエストの状況を検証する

前回紹介した,スパイの機能も使えます。

たとえば,前回は目視確認した「MiniblogClient#entry_listで,3回(friendsの数だけ)/messages/:users.jsonにアクセスしていること」を自動化テスト内で検証するには,次のようなテストを書きます。

diff --git a/spec/miniblog_client_spec.rb b/spec/miniblog_client_spec.rb
@@ -42,4 +42,15 @@ describe MiniblogClient do
      @client.post_entry("moro", "こんばんは")
    end
  end
+
+ describe "#entry_list" do
+   before do
+     conn = Connection.new("localhost", 3080)
+     client = MiniblogClient.new(conn, "alice", "bob", "charls")
+
+     client.entry_list
+   end
+   subject { WW::Server[:miniblog] }
+   it { should have(3).requests }
+ end
 end

スパイとして定義したアクションへのリクエストは,WW::Server#requestsメソッドで取得できます。 例では回数だけを検証していますが,このリクエストオブジェクトからHTTPメソッドやパス,クエリパラメータなどを取得して検証できます。ただし,あくまでスパイですので,モックのように自動的に検証したりはしません。スパイしたリクエストを取得し,この例のshould have(3).requestsのように自分で検証する必要があります。

このテストを実行すると、次のようにパスします。

$ spec -fn -c spec/miniblog_client_spec.rb

MiniblogClient
  サーバが正常に起動していること
  #post_entry
    /messageにメッセージをPOSTすること
  #entry_list
    should have 3 requests

Finished in 0.197325 seconds

3 examples, 0 failures

モックとスパイを使い分ける判断基準ですが,筆者の感触では,サーバ側のAPIを含めて設計していたり,そのAPIを始めて使ったりと「自分が作っているものがハッキリしない」場合はスパイから取得したリクエストをもとに試行錯誤するほうがよいと感じています。その後,ある程度動くものができてからは,モックを使ってテストすべきことを明確にすると,意図を表現できているよいテストになりそうです。

おわりに

今回は,wwを自動化テストから使い,Webサーバとの間で行われているインタラクションを検証する方法を説明しました。

wwは現在も開発中であり,機能のリクエストやバグ報告,よりよいAPIの提案なども募集中です。アイディアがありましたらhttp://github.com/moro/ww/issuesやTwitterの@moroなどで,いろいろお聞かせいただければ嬉しく思います。

外部サービスとの連携は,アプリケーション開発の中でも特に難しく感じることが多い場面です。wwが少しでもその不安を取り除き,楽しくテストを書くために役立てればうれしく思います。

著者プロフィール

諸橋恭介(もろはしきょうすけ)

(株)永和システムマネジメントサービスプロバイディング事業部所属,Rails勉強会@東京を主催。RubyやRailsを使った受託開発に従事。CucumberやRSpecを使って,楽しくテスト駆動開発を行いたいと思っている。
著書に「Railsレシピブック 183の技」(共著・ソフトバンククリエイティブ)がある。

ブログ:http://d.hatena.ne.jp/moro/
Twitter:http://twitter.com/moro/