2011-09-06 30 views
9

私はsunspot-railsを検索に使用します。これらはRspecのようです:Rspecでsolrから接続が拒否されました

describe "GET search" do 
    before(:all) do 
    system("rake", "sunspot:solr:start") 
    end 

    after(:all) do 
    system("rake", "sunspot:solr:stop") 
    end 

    it "should do some search" do 
    Text.search do 
     ... 
    end 
    end 
end 

しかし、それは動作しません。私は失敗しました:

Errno::ECONNREFUSED: 
    Connection refused - connect(2) 

をしかし、私は、コマンドラインに手でrake sunspot:solr:start RAILS_ENV=testを入力し、[スペックを実行する場合、それが渡されます。

どういうところが間違っていますか? rake sunspot:solr:start RAILS_ENV=testは、テストモードでsystem("rake", "sunspot:solr:start")に相当しますか?

(私は `システム(「熊手」試してみました、。。)「黒点:SolrのRAILS_EVN =テストを開始」と同じ)

答えて

14

あなたのbefore(:all)はおそらく、開始するのに十分な時間をSolrに与えていません。

これは、ここで確認するために仕様を尋ねていることだけを考えていると思います。あなたはFakewebのような図書館でSolrへの呼び出しを嘲笑して、長い道のりを歩むことができます。

また、Pivo​​tal Labsには、呼び出す検索に関するより詳細なアサーションを取得できるsunspot_matchersというライブラリがあります。

Solrとの実際の統合仕様を検討している場合は、作業中にSolrテストを実行しておくことをお勧めします。 Foremanのようなツールを使用すると、Solrのプロセスを管理できます。あなたはスペック内のSolrを開始したい場合は、

solr_dev: rake sunspot:solr:run RAILS_ENV=development 
solr_test: rake sunspot:solr:run RAILS_ENV=test 

(何RAILS_ENVがそうforeman startに提供されていない場合の開発はもちろん、デフォルトの環境である)

最後に:私は次のようProcfileを使用する場合がありますあなたはすでに正しい方向に進んでいます。 sleepをそこに投げて、あなたの仕様が動作する前にSolrを完全に起動させるのに十分な時間を置いてください。システムに負荷がかかっているときに予期せぬ障害が仕様スイートに導入されても、驚かないでください。

[編集:クイックと汚いbefore :all可用性をポーリングするSunspot.remove_allを使用しています。]

before :all do 
    `sunspot-solr start` 
    begin 
    Sunspot.remove_all! 
    rescue Errno::ECONNREFUSED 
    sleep 1 && retry 
    end 
end 
+0

ありがとうございました。ところで、私の仕様でsolrが動作しているかどうかを知るにはどうすればいいですか?私はより適切なカスタム例外を '接続が拒否されました'としたいです。 –

+0

'Errno :: ECONNREFUSED'はかなり参考になるはずです。実際に、それを使って可用性をポーリングすることができます。ちょうどそれを編集でハッキングしました。 –

+0

素晴らしいソリューション。私のために夢のように働いた。 – nfriend21

0

これは、野生ロバの推測ですが、私はあなたがSolrのサーバが設定されている賭けますあなたの設定/環境/ development.rbに特定のポート上でローカルに検索するファイルが、あなたの設定/環境/ test.rbでいないような構成

これは/それがデフォルトのアドレスに接続させていますあなたが実際にテストを実行したときにSolrサーバを実行していないポート。

RubyのSolrクライアントについては、これを確実に知るには十分ではありませんが、他の誰もまだ重視していないので、これが正しい方向に向いていることを願っています。

11

sunspot_test gemはあなたのためにこれを行うと、RSpecのをサポートしています。

+0

素晴らしいです、これは確かに正しい答えです! – Matthew

+0

間違いなく優雅な答えと宝石 - ありがとう。 –

0

私はこれは

編集をspec_helper.rbする

`rake sunspot:solr:start RAILS_ENV=test` 

を追加することによって、ちょうど働いて得た:Simmoが述べたように私はhttps://github.com/collectiveidea/sunspot_test一緒に行くことになりました。それは何らかの理由で(たとえ私がsporkのpreforkブロックでそれを持っていたとしても)毎回のテスト実行時にrakeタスクを再実行していました。理由は分かりませんが、sunspot_testの宝石は今のところ行く方法のようです。

+0

Rails 3.1でうまく動作しますか? –

関連する問題