2005-04-14
[開発ログ]テストに挑戦
よく知らないが見よう見まねでテストを書いてみる。
require 'jewelcore.rb' require 'arconf.rb' module JewelCore class Useradd < CoreCommand class Core_name_exists < Core_Error ; end class Core_name_is_too_short < Core_Error ; end class Core_password_is_too_short < Core_Error ; end class Core_invalid_user_name < Core_Error ; end def find_session sid end def exec name = @options[0] pass = @options[1] raise Core_invalid_user_name, name if name =~ /[^0-9A-Za-z_-]/ raise Core_name_exists, name if User.find_by_name(name) raise Core_name_is_too_short, name.size.to_s if name.size < 3 raise Core_password_is_too_short, pass.size.to_s if pass.size < 3 user = User.create(:name => name, :password => pass) true end end end if defined? Test::Unit class Test_CoreCommands < Test::Unit::TestCase def test_useradd [ {:name => 'username', :password => 'pass'}, {:name => '000', :password => 'pass'}, {:name => '-00', :password => 'pass'}, {:name => 'aa_', :password => 'pass'}, {:name => '0123456789abc', :password => 'pass'}, ].each do |v| user = OpenStruct.new v assert Useradd.new(nil, user.name, user.password).result assert_raises Useradd::Core_name_exists do Useradd.new(nil, user.name, user.password) end end end def test_useradd_faile ['aa/','aa*','00"','00あ'].each do|name| assert_raises Useradd::Core_invalid_user_name do Useradd.new(nil, name, 'pass') end end ['','u','uu','0'].each do|name| assert_raises Useradd::Core_name_is_too_short do Useradd.new(nil, name, 'pass') end end ['','u','uu','0'].each do|pass| assert_raises Useradd::Core_password_is_too_short do Useradd.new(nil, 'user', pass) end end end end end
コードそのものとテストコードを離したくなかったので同じファイルに書いている。テストを書くのはそれほど面倒ではない。逆に端末でいちいちコマンドを実行しながらデバッグするより楽かもしれない。これくらいだと自然にテストファーストができる。
例外クラスを作るのは初めてかもしれない。こんな使い方でいいのだろうか。
パスワードはノーチェックで DB 行きで大丈夫だろうか。
上記テストコードを呼び出すスクリプトはこんな感じ。
#!/usr/bin/env ruby require 'test/unit' Dir.glob('command/*.rb').each{|s| require s} class Test_CoreCommands < Test::Unit::TestCase include JewelCore def setup_user(user) User.destroy_all Useradd.new(nil, user.name, user.password) user.sid = Login.new(nil, user.name, user.password).result user.db = CoreCommand.new(user.sid).session.user user end def setup require 'ostruct' @user = setup_user OpenStruct.new(:name => 'testman00', :password => 'pass') @target = OpenStruct.new :name => 'target00', :password => 'pass' #setup_user @target end def teardown end def create_doll(user, num) Filldolls.new(user.sid, num) end def test_ end end
テストは重要な気がするのでちゃんと勉強したい。