testコードではパフォーマンスやセキュリティをさほど気にすることはないと思うので、testコードで evalを使って楽できるケースを書いてみたいと思います。
よく似たModel で Userと Admin があるとします。 二つの Model には confirm というメソッドが定義されていて、ユーザ登録をしてメールで送られてくる URLを をクリックすると status が 'register' から 'confirm' に変更されます。
class UserTest < Test::Unit::TestCase
def test_with_confirm
user = User.find(:first, :conditions => ["status = ?", 'register'])
user.confirm
assert(user.status == 'confirm', 'confirm error')
end
end
というテストをUserTest と AdminTest に書きます。
しかし以下のような moduleを継承しておくと DRYに書けます
module UserModelTestHelper
def get_class
k = self.class.to_s.gsub(/Test$/, '')
eval k
end
def test_with_confirm
user = get_class.find(:first, :conditions => ["status = ?", 'register'])
user.confirm
assert(user.status == 'confirm', 'confirm error')
end
end
このようなクラスを定義しておくと module を incude するだけで 勝手にテストが生成されます。
class TestUser < Test::Unit::TestCase
include UserModelTestHelper
end
class TestAdmin < Test::Unit::TestCase
include UserModelTestHelper
end
同じような 共通のテストは UserModelTestHelperにどんどん追加するだけです。
上記の例では クラス名を evalで Modelに変換していますが、テストファイル名やメソッド名を利用すると同じように楽できるケースがあると思います。。またUnitテストだけではなく Rspecなどにも普通に使えるのでNiceな方法を思いついたらぜひ教えてください