畠山です。 自分でいろいろやってはみたもののうまい解決方法が見つからなかったので、もしどなたか何か良いアイデアがありましたらアドバイスお願いします。 (似たような状況は私以外にも多分結構あるだろうとも思うので少々長いですが投稿させてもらいます。) * 問題状況 ユニットテストであるクラスのメソッドをテストしているのですが、いくつかのメソッドに sleep が入っています。 それぞれ数秒〜30秒くらいが設定されていて、これをそのままテストすると各テストで毎回数十秒間止まってしまいます。 (テスト数が多いのでこれはなんとか避けたい) あるメソッドに関してはこの sleep はスキップしても問題ないのですが、あるメソッドでは sleep は必要な処理でテスト中でもスキップできません。 * やりたいこと(できたらうれしいこと) そこであるテストケースだけ sleep をスキップして、あるテストケースでは sleep をスキップしない、ということはできるかどうか。 * やってみたこと テストケースの始めに def sleep(arg) end などと再定義すればスキップできますが、これではすべてのテストケースに反映されてしまいます。 また flexmock で flexstub(Kernel).should_receive(:sleep) などとしてもだめでした。 つまりは、flexmock を使って Kernel モジュールで定義されているメソッドを再定義できるとうれしいです。 もしくは、各テストケースで sleep を無理矢理 Thread#run させるようなことができてもうれしいです。 別々にテストをすれば済むことですが、テスト数が多すぎるので以下のような suite.rb を自前で用意して一括してテストを実行しています。 suite.rb ---- Dir.foreach(".") do |file| if file =~ /test.+\.rb/ and file != __FILE__ require file end end 具体的には以下のテストで Klass1#method の sleep はスキップさせて、Klass2#method では sleep を有効にできないか、と考えています。 klass.rb ---- class Klass1 def method sleep(100) end end class Klass2 def method sleep(2) end end ---- testcase.rb ---- require 'klass' require 'test/unit' =begin def sleep(arg) arg end =end class TestKlass1 < Test::Unit::TestCase def test_method obj = Klass1.new assert_equal(100, obj.method) end end class TestKlass2 < Test::Unit::TestCase def test_method obj = Klass2.new assert_equal(2, obj.method) end end ---- 長々すいませんでしたがどうぞよろしくお願いします。 畠山