プラグインを作るのに手間取ったのでメモ。
ARに機能を追加させるようなプラグインのテストを書く際、AR派生クラスをnewしてメソッドを呼び動作を確かめたりしたくなります(私の場合、privateメソッドを呼びたくなった)。でもテストのためだけにテーブルを作るのはばからしい。でMockを使う方法、ARのテスト用Mockの登場です。
ポイントとしては、MockBaseで一旦ARを派生させてから、MockBaseを派生させたクラスを作るのがミソです。そうすることで他のテストに影響を与えないようにすることができます(tips from takiuchi)。
あともう一つ、environment.rbをズズーっとロードすることでRails全体を読み込むことができます。それによってARを使えるようになります。
1
2 begin
3 require File.dirname(__FILE__) + '/../../../../config/environment'
4 rescue LoadError
5 require 'rubygems'
6 gem 'activerecord'
7 require 'active_record'
8 end
9
10 class MockBase < ActiveRecord::Base; end
11 MockBase.class_eval do
12 alias_method :save, :valid?
13 def self.columns() @columns ||= []; end
14
15 def self.column(name, sql_type = nil, default = nil, null = true)
16 columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type, null)
17 end
18 end
19
20 class MockModel < MockBase
21 acts_as_notifiable :callback => :after_create, :message => "hello", :recipients => "test@gmail.com"
22 end
23
24 class ActsAsNotifiableTest < Test::Unit::TestCase
25 def test_option_message_string
26 assert_equal "hello", MockModel.new.instance_eval{jabber_message}
27 end