2011-09-06 49 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電話。

Pivotal Labs也有一個名爲sunspot_matchers的庫,可以捕獲更多關於您正在調用的搜索的細粒度的斷言。

如果您打算使用Solr的真正集成規格,我建議您在工作時保持測試Solr運行。像Foreman這樣的工具可以幫助管理你的Solr程序。我可能會使用一個Procfile類似如下:

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

(發展是當然的,如果沒有RAILS_ENV另有規定外,以foreman start默認環境)

最後,如果你想你的規格內開始的Solr ,你已經走上了正軌。只需在裏面投一個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

我得到這個工作只是通過增加

`rake sunspot:solr:start RAILS_ENV=test` 

到spec_helper.rb

編輯:我結束了https://github.com/collectiveidea/sunspot_test會像SIMMO提及。由於某種原因,它在每次測試運行中重新運行rake任務(儘管我在spork的prefork塊中已經有了它)。不知道爲什麼,但sunspot_test寶石似乎是現在的方式。

+0

它適用於Rails 3.1嗎? – 2011-11-14 08:10:04