query: tag:mock

プラグインを作るのに手間取ったのでメモ。
ARに機能を追加させるようなプラグインのテストを書く際、AR派生クラスをnewしてメソッドを呼び動作を確かめたりしたくなります(私の場合、privateメソッドを呼びたくなった)。でもテストのためだけにテーブルを作るのはばからしい。でMockを使う方法、ARのテスト用Mockの登場です。

ポイントとしては、MockBaseで一旦ARを派生させてから、MockBaseを派生させたクラスを作るのがミソです。そうすることで他のテストに影響を与えないようにすることができます(tips from takiuchi)。

あともう一つ、environment.rbをズズーっとロードすることでRails全体を読み込むことができます。それによってARを使えるようになります。

rails>>
#acts_as_notifiable_test.rb
begin
require File.dirname(FILE) + '/../../../../config/environment'
rescue LoadError
require 'rubygems'
gem 'activerecord'
require 'active_record'
end

class MockBase < ActiveRecord::Base; end
MockBase.class_eval do
alias_method :save, :valid?
def self.columns() @columns ||= []; end

def self.column(name, sql_type = nil, default = nil, null = true)
columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type, null)
end
end

class MockModel < MockBase
acts_as_notifiable :callback => :after_create, :message => "hello", :recipients => "test@gmail.com"
end

class ActsAsNotifiableTest < Test::Unit::TestCase
def test_option_message_string
assert_equal "hello", MockModel.new.instance_eval{jabber_message}
end
<<--

###Reference

posted by satoko satoko on Thu 6 Mar 2008 at 10:59 with 0 comments

Railsのテストフレームワークには、Mockを利用する仕組みがあります。
しかし、通常の方法でMockクラスを作成すると、オリジナルのクラスを
完全に置き換えてしまうため、すべての実装をテスト用に
書き直さなければならなくなってしまいます。

そこで、テスト用に改変したい場所だけMockで上書きし、その他の
動作はオリジナルに委譲する方法を紹介します。

rails>>
require_dependency 'models/foo'

class Foo
def bar
puts 'baz'
end
end
<<--

上記のように、require_dependencyを使ってapp
ディレクトリ以下のファイルを参照することで、Fooクラスのbar
メソッドの挙動だけを置き換えることができるようになります。

posted by genki genki on Fri 1 Feb 2008 at 13:24 with 0 comments