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」と一致)の場合にだけロードされるため、切り替え漏れなどの心配がありません。
|