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
テストは重要な気がするのでちゃんと勉強したい。