Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
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

テストは重要な気がするのでちゃんと勉強したい。