質問

DataMapperの delayed_job クローンを作成しています。ワーカープロセス内のスレッドを除いて、動作していると思われるコードをテストし、コードをテストしました。これをテストする方法については delayed_job を探しましたが、現在はコードのその部分のテストがあります。以下は、テストする必要があるコードです。アイデア? (私はrspec BTWを使用しています)

def start
  say "*** Starting job worker #{@name}"
  t = Thread.new do
    loop do
      delay = Update.work_off(self) #this method well tested
      break if $exit
      sleep delay
      break if $exit
    end
    clear_locks
  end

  trap('TERM') { terminate_with t }
  trap('INT')  { terminate_with t }

  trap('USR1') do
    say "Wakeup Signal Caught"
    t.run
  end

このスレッド

も参照してください。
役に立ちましたか?

解決

テスト時にワーカーをサブプロセスとして起動し、完全に起動するのを待ってから、出力を確認したり、シグナルを送信したりできます。

Unicorn プロジェクトから、この分野でかなり多くの具体的なテストのアイデアを得ることができると思います。

他のヒント

最良のアプローチは、 Thread.new メソッドをスタブ化し、「複雑な」ものを確認することです。ものは、個別にテストできる独自のメソッドにあります。したがって、次のようになります。

class Foo
    def start
        Thread.new do
            do_something
        end
    end
    def do_something
        loop do
           foo.bar(bar.foo)
        end
    end
end

その後、次のようにテストします。

describe Foo
    it "starts thread running do_something" do
        f = Foo.new
        expect(Thread).to receive(:new).and_yield
        expect(f).to receive(:do_something)
        f.start
    end
    it "do_something loops with and calls foo.bar with bar.foo" do
        f = Foo.new
        expect(f).to receive(:loop).and_yield #for multiple yields: receive(:loop).and_yield.and_yield.and_yield... 
        expect(foo).to receive(:bar).with(bar.foo)
        f.do_something
    end
end

こうすることで、目的の結果を得るためにあまり手間をかける必要がなくなります。

スレッドを完全にテストすることは不可能です。できることは、モックを使用することです。

(次のようなもの)     object.should_recieve(:trap).with( 'TERM')。and yield     object.start

テストでスレッドを明快にするだけでどうですか。

Thread.stub(:new).and_yield
start
# assertions...
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top