Rubyで動的に関数定義3(for Test::Unit)  [ruby]  [tips]  [TDD]

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くらい使い勝手が良くなるかもね。