丁稚な日々

Rubyで遊んだ日々の記録。あくまで著者視点の私的な記録なので、正確さを求めないように。
Rubyと関係ない話題にはその旨注記しているはず。なので、一見関係無いように見える話題もどこかで関係あるのかもしれません。または、注記の書き忘れかもしれません...

[直前] [最新] [直後] [Top]

Oct.2,2006 (Mon)

Revision: 1.1 (Oct.02,2006 16:50)

instruby.rb

_ test-allが動かない話の絡みで久し振りにtestrb.batを実行してみようとして、バッチファイルが壊れてることに気付く。
いやー、早めに気付いてよかった。12月まで気付かなかったら壊れたまま1.8.6が出ちゃうもんな。

_ 壊れるに至った変更の意図が理解できない(ChangeLogにない)ので、とりあえず元と同じファイルが生成されるように直しておいた。
なんか意図があったなら、適当によろしく>なかださん

Oct.5,2006 (Thu)

Revision: 1.6 (Oct.06,2006 21:52)

テストクラスの名前

プログラマA
他の人の書いたユニットテストのクラスと俺の書いたユニットテストのクラスの名前が衝突しちゃってさー。
プログラマB
たまにあるよねー。setupの定義を上書きしちゃったりして悲惨なことになるんだよね。
プログラマA
test/unit側でどうにかできないのかなあ?
プログラマB
Test::Unit:TestCaseClass#inheritedを定義しておいて名前の衝突を検出するとか?
確かに意図的にテストクラスを再定義することはないとは思うけど、やりすぎじゃね?
プログラマA
そもそもテストクラスの名前なんかどうでもいいのにねえ。
プログラマB
そうだよ! 最初から名前をつけなければいいんだよ!
プログラマA
な、なんだってー!(AAry

... という会話があったかどうかはさておき、

class SomeTestClass < Test::Unit::TestCase
  ...
end

はもう古い!
これからは、

Class.new(Test::Unit::TestCase) do
  ...
end

ですよ奥さん!

_ 続き。

プログラマA
でもさー、-vとか失敗した時とかクラス名出ないのさびしいよね。
プログラマB
どうせクラス名なんか見ないでファイル名と行番号しか見ないからいいじゃん。
プログラマA
-vはファイル名出ないよ。
プログラマB
出るようにすればいいだけだよ!
プログラマA
それがけっこうめんどいんだよね。
かと言って-vでテスト名だけだと、テストがどこまで進んでるか見てもわかりにくいし。
プログラマB
うーん、困ったねえ。
プログラマA
... 要するにテストクラスの名前が衝突することだけが問題なんだから、テストクラスには素直に名前をつけて、それを無名モジュールに置けばいいんじゃない?
プログラマB
おー、なるほど。こうかな?
Module.new do
  class SomeTestCase < Test::Unit::TestCase
    ...
  end
end
プログラマA
... それ、ネストになってないよ。
プログラマB
なるもん! 1.9ならなるもん!
プログラマA
こんなところにも1.8と1.9の違いが!
プログラマB
1.8だとどうすればいいのかなあ?
プログラマA
えーと、Module#const_setを使って...
Module.new do
  const_set("SomeTestCase", Class.new(Test::Unit::TestCase) do
    ...
  end)
end
プログラマB
おー、できたできた。
プログラマA
あれ、でもまずいな。テストクラス名が出ないよ。
プログラマB
うへー、クラスができた時点でもう名前収集しちゃってるのか、ひょっとして。
プログラマA
いや、そうじゃないみたいだね。ほら。
% ruby -e 'Foo = Class.new; p Foo.name'
"Foo"
% ruby -e 'Module.new{Foo = Class.new; p Foo.name}'
nil
プログラマB
えー、納得いかないよー...
プログラマA
ちゃんとモジュールに名前をつければクラス名も取れるようになる。
プログラマB
なるほどー。って意味ないし!

_ さらに続く。

プログラマA
うーん...
あ、難しく考えすぎてたね。これでいいじゃん。
Module.new do |mod|
  class mod::SomeTestCase < Test::Unit::TestCase
    ...
  end
end
プログラマB
あれ、単にこれでいいの?
なんか拍子抜け... って、1.9だとエラーじゃん!
プログラマA
これは1.9のバグだねえ。modnilになってる。

というわけで([ruby-dev:29637])、めでたしめでたし(?)

_ なお、以上の掛け合いは実際の出来事を元にしたフィクションなので、実在の人物が実際にこんな発言をしたりこんなコードを書いたりしていたわけではありません。

Oct.10,2006 (Tue)

Revision: 1.2 (Oct.10,2006 16:26)

テストクラスの名前

_ 先日の続き。

プログラマA
さて、これをメソッド化したいんだけど、うまくいかない
プログラマC
moduleなんか使わずにこれでいいじゃん。
def define_test(test_name, &block)
   klass = Class.new(Test::Unit::TestCase)
   class << klass; self; end.class_eval {define_method(:name) {test_name}}
   klass.class_eval(&block)
end
プログラマA
おお、すばらしい。もうちょっと調整してTest::Unitの特異メソッドにして、と。define_singleton_methodがあるとすれば、こうだね。
module Test::Unit
  def self.define(test_name = caller.first.sub(/ in `.*'\z/, ''), &block)
    Class.new(Test::Unit::TestCase) do |klass|
      klass.define_singleton_method(:name, &test_name.method(:to_s))
      klass.class_eval(&block)
    end
  end
end

被捕捉アンテナ類
[\ay antenna (testing)] [Ant] [Antenna-Julia] [LayserあんてなV2] [nAntenna] [nuance de Antenna] [Rabbit's Antenna] [Read List] [Ruby hotlinks 五月雨版 (るるりん。)] [してたま (私的アンテナ with たまてばこ)] [ただのあんてな] [ちゃらんぽらん] [でこぽんリンク] [なよろアンテナ] [にっきトレーサー] [偽善者あんてな - 2nd season -] [湘南日記放送局(SDB)] [はてなの各アンテナ]