Rubyで動的に関数定義
Rubyで動的に関数定義2
からの続き。
で、今回いろいろ調べていた大元の理由である「テストケースの自動生成」だけど、こんな感じで使えそう。
テスト対象
class Testee
def login(login_user)
@login_user ||=login_user
end
def who_am_i?
@login_user
end
end
一つのテストケース内でログインの試験を複数回やると、初回のログイン情報が残るためにfailする。
require 'test/unit'
require 'testee'
class TesteeTest < Test::Unit::TestCase
def test_should_login
@testee.login(:hoge)
assert_equal :hoge, @testee.who_am_i? # => ok
@testee.login(:fuga)
assert_equal :fuga, @testee.who_am_i? #=> fail :hogeが残ってる
end
end
今までなら、複数の試験を手書きしてた。
そこで、今回勉強してきた、define_methodを利用してテストケースを自動生成してみる。
require 'test/unit'
require 'testee'
class TesteeTest < Test::Unit::TestCase
def self.generate_test
while login_name = DATA.gets do
login_name.chomp!
define_method("test_should_login_by_#{login_name}") do
@testee.login(login_name)
assert_equal login_name, @testee.who_am_i? , " error on login by #{login_name}"
end
end
end
def setup
@testee = Testee.new
end
end
__END__
:hoge
:fuga
うまくやれば、PerlのTest::Baseくらい使い勝手が良くなるかもね。
ツイート