1

Sinatraアプリケーションを使用して、バックグラウンドプロセスを実行する3つの方法を見つけました。

  1. Thread.new
  2. Process.fork
  3. Process.spawn

最初の2つを機能させる方法を理解しましたが、現在の課題は、テストを同期的に実行する必要があることです(いくつかの理由で)。

本番環境でジョブを非同期で実行し、テストを強制的に同期的に実行するための良い方法は何ですか?できればspec_helper...?

Ruby 1.9.3、Sinatraアプリ、RSpec。

4

2 に答える 2

2

次のハイブリッドアプローチをお勧めします。

  1. 簡単な単体テストを作成し、テスト対象を同期するようにリファクタリングします。つまり、すべてのバックグラウンド機能を、単体テストを簡単に実行できる単純なクラスとメソッドに配置します。次に、バックグラウンドプロセスは、すでに単体テストされている同じ機能を呼び出すことができます。これはすでにruby(または、などgodの別のライブラリ)でテストされているため、バックグラウンドスレッド/プロセスの作成自体を単体テストする必要はありません。このTDDアプローチには、コードベースをより保守しやすくするという追加の利点があります。bluepillDaemons

  2. 機能テストと統合テストについては、のアプローチに従い、次のようにdelayed_jobすべてのバックグラウンド作業を同期的に実行する方法を提供します。Delayed::Worker.new.work_off

また、特にバックグラウンドプロセスがIOを集中的に使用する場合(たとえば、httpまたはデータベース要求を行う場合)、生成スレッドまたはプロセスでEventMachineを使用することを検討することもできます(SinatraがEventMachine WebSocketsと連携して成功する場合など)。

于 2012-12-12T01:38:57.713 に答える
0

これが私が思いついたものです:

process_in_background { slow_method }

def process_in_background
  Rails.env == 'test' ? yield : Thread.new { yield }
end

def slow_method
  ...code that takes a long time to run...
end

このソリューションは透過的であるため、私はこのソリューションが好きです。まったく同じコードを同期して実行します。

それに関する提案/問題はありますか?ゾンビを管理する必要がありますか?どのように?

于 2012-12-12T02:00:57.740 に答える