TOPシステム開発> Railsでモックを実現
徹底比較!!Ruby on Rails vs Javaフレームワーク
徹底比較!!Ruby on Rails vs Javaフレームワーク

第4回:DIコンテナとの比較

著者:アスタリクス  大西 正太   2006/9/20
前のページ  1  2  3   4  次のページ
Railsでモックを実現

   RailsではRubyのダイナミックな仕組みを用いることでモック化を実現します。「プロジェクトルート/test/mocks/環境モード名」というフォルダ内の所定位置に、モック化したいクラスと同名のクラスを配置するだけでモックとして認識されます(図2)。
モッククラスの配置
図2:モッククラスの配置

   ソースはリスト8〜10のようになります。

リスト8:Railsでのモッククラス(/test/mocks/test/credit_card_auth.rb)
require 'models/credit_card_auth'
class CreditCardAuth
   def auth(card_no)
      return true
   end
end

リスト9:Railsでの本番クラス(/app/models/credit_card_auth.rb)
class CreditCardAuth < ActiveRecord::Base
   def auth(card_no)
      #クレジットカード処理を記述
      ...
   end
end

リスト10:Railsでの呼び出し側クラス
class ItemController < ApplicationController
   def buy
      card_auth = CreditCardAuth.new
      card_result = card_auth.auth(params[:card_no])
      (中略)
   end
   (中略)
end

   この機構は、Rubyの「Open Class」などと呼ばれる特徴を利用しています。Open Classとは「再オープン可能なクラス」という意味で、何回でもクラスを再宣言してメソッドを追加したり上書いたりできる機構です。

   リスト8ではrequire文で一度本物のCreditCardAuthクラス定義(リスト9)を読み込み、更にそのクラス定義を再オープンして、モックのCreditCardAuthメソッドで上書いています。

   また、Railsには環境モードという考え方があり、単体/機能テストを実施する際には自動的にtestモードに切り替わります。「/test/mock/test」下に置かれたモックはtestモード(ディレクトリ名「test」と一致)の場合にだけロードされるため、切り替え漏れなどの心配がありません。


モックオブジェクトの比較

   Java/DIもRailsも、ダイナミックな機構をうまく活用してテスト時にモックオブジェクトを適用できるようにしています。

   ただし、Javaではインターフェースや定義ファイルなど、モック本体以外のものを作成する必要があります。一方Railsではモック本体を決まった場所に配置するだけでよく、ソースコードの分量という意味ではRailsが優勢であるといえます。

   そもそもRubyはインターフェースという考え方自体がありません。「ダックタイピング」という考え方(メソッドが呼び出せれば型に関わらず多態性を持てる)に基づいているためです。


トランザクション

   続いて、トランザクションについて比較します。

   トランザクションとは、データベースの更新中に処理が異常終了した際、ロールバックして戻し、データを中途半端な状態にしない機構のことをいいます。一般にトランザクションの利用は「宣言的なトランザクション」と「プログラマティックなトランザクション」に分けられます(表3)。

宣言的
ビジネスロジックとは別の場所で、メソッド毎やクラス毎など、一括してトランザクションの指定を行う。
プログラマティック
ビジネスロジック内にトランザクションの記述を行う。

表3:トランザクションの種類

   宣言的なトランザクションはまとめてトランザクション指定が可能なため、最終的なコード量が削減される他、トランザクションの記述漏れを防止することができます。プログラマティックなトランザクションは、毎回指定が必要ですが障害時の処理をより詳細に記述することができます。

   これらの方法はどちらが優れているというわけではありません。全体は宣言的に指定し、細かな指定が必要な部分ではプログラマティックに指定するといった具合に、双方を併用することで生産性と品質が共に向上すると考えられます。

前のページ  1  2  3   4  次のページ


デル株式会社
著者プロフィール
株式会社アスタリクス  大西 正太
JavaEEフレームワークの設計構築や開発プロセス策定などの業務を経て、現在は新規ビジネス創生に携わる。Ruby on Rails上に構築したオープンソースのCMS「Rubricks」(http://rubricks.org/)のコミッタ。


INDEX
第4回:DIコンテナとの比較
  はじめに
  Java/DIのモックオブジェクト
Railsでモックを実現
  Java/DIのトランザクション