2006-11-02
Test::Base on Rails
routing みたいな単純な UnitTest にはやっぱ Test::Base いいなぁ。Test::Unit::TestCase 継承してるから Rails でも特に何にもせずに使えるよ。あとは Integration Test を楽に記述できるかどうかかなー。それと、今は run_tests の引数で Struct として渡ってくるんだけど、割と不便。値があるかどうかいちいち respond_to? で調べるのめんどい。Hash のほうがいい気がしてきた。選択できるようにすっかなぁ。
routing の test はこんな風にかける。
require File.dirname(__FILE__) + '/../test_base_helper'
class RoutingTest < Test::Base
filters :path => %w(.strip),
:type => %w(.strip .to_sym),
:options => %w(yaml)
def run_tests(spec)
case spec.type
when :recognize
assert_recognizes spec.options, spec.path
when :generate
assert_generates spec.path, spec.options
when :routing
assert_routing spec.path, spec.options
else
raise "No Routing Type:#{spec.type}"
end
end
end
__END__
===
--- type: recognize
--- path: /secondlife/
--- options
:controller: home
:showuser: secondlife
:action: list
===
--- type: generate
--- path: /secondlife/
--- options
:controller: home
:showuser: secondlife
===
--- type: routing
--- path: /secondlife/2005/11/9/foobar
--- options
:controller: home
:action: show
:showuser: secondlife
:year: "2005"
:month: "11"
:day: "9"
:name: foobar
===
--- type: routing
--- path: /secondlife/comment/2005/11/09/foobar
--- options
:controller: home
:action: comment
:showuser: secondlife
:year: "2005"
:month: "11"
:day: "09"
:name: foobar
===
--- type: routing
--- path: /secondlife/edit/2005/11/9/foobar
--- options
:controller: home
:action: edit
:showuser: secondlife
:year: "2005"
:month: "11"
:day: "9"
:name: foobar
Shell.export
http://search.cpan.org/dist/Shell/Shell.pm
ruby の Shell クラスだと perl の Shell モジュールの export みたいなのができないので書いてみた。こんなの。
require 'shell'
class Shell
def self.export(*names)
names.flatten.each do |name|
Kernel.__send__(:define_method, name) {|*args|
`#{name} #{args.join(' ')}`
}
end
end
end
これで
Shell.export %w(df uname)
puts df
puts uname('-a')
で↓とか。
Filesystem 1K-ブロック 使用 使用可 使用% マウント位置
/dev/cobd0 10485436 4748896 5736540 46% /
tmpfs 258104 28 258076 1% /dev/shm
/dev/cobd2 3145628 2954896 190732 94% /home
cofs0:/ 54023728 26656336 27367392 50% /mnt/c
Linux paprika 2.6.17-co-0.8.0 #6 PREEMPT Tue Oct 3 14:50:35 CEST 2006 i686 GNU/Linux
親クラスの inherited を呼び出す inherited 定義方法
ActiveSupport 使ってて書いていてはまった。。。class#inherited 定義しちゃうと親クラスの inherited 呼び出されなくなって(そりゃそうだ)へんなところでエラった。
それを回避するには別名でまずは inherited を定義してやって、alias で元の inherited を別名にして、自分で定義した inherited に alias をはる。んで自分で定義した inherited の中では元の inherited の別名を調べて、あったらそいつを呼び出す、みたいな。
言葉だけだとわかりにくいんでコード
class Foo
class << self
private
def inherited(subclass)
puts "inherited Foo's subclass: #{subclass}"
end
end
end
class Bar < Foo
class << self
private
def inherited_with_bar(subclass)
inherited_without_bar(subclass) if respond_to?(:inherited_without_bar, true)
puts "inherited Bar's subclass: #{subclass}"
end
alias inherited_without_bar inherited
alias inherited inherited_with_bar
end
end
class Baz < Bar
end
実行すると
inherited Foo's subclass: Bar
inherited Foo's subclass: Baz
inherited Bar's subclass: Baz
となる。
追記
ActiveSupport だと aliath_method_chain で簡略化できるらしい。へー。
rails の breakpointer
ruby 1.8.5 じゃそのまんまじゃうごかないのか。
http://eigenclass.org/hiki.rb?call_stack
入れないとダメと。今 rails 1.2.0_pre つかってるんだけど各所で warning が出るのは良いな。
かうんと
http://d.hatena.ne.jp/babie/20061102/1162405547
んー。ふつうにARの condition に time オブジェクト渡せばいいと思った。あと sort_by 使うべきだと思った(速度的にも)。あとこの場合find(id)じゃなくて in でつっこむべきじゃないかなぁとおもった。
というかなんで order_by と limit つかわないんだろう。
カップラーメンの熱湯を
てにこぼしたあちいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい
とりあえず Test::Base コミット
http://rubyforge.org/cgi-bin/viewvc.cgi/?root=test-base
svn co svn://rubyforge.org/var/svn/test-base
で co できる。viewvc みにくいお。。。つかいろいろ改善とリファクタリングしねーとな。。