2010-11-11 86 views
8

我在調用thinking_sphinx的search()方法的模型中有一個類方法。我需要檢查這個類的方法。如何使用RSpec測試ThinkingSphinx

我想在我的rspec測試用例中啓動,索引或停止sphinx。我正在嘗試使用這段代碼。

before(:all) do 
    ThinkingSphinx::Test.start 
end 

after(:all) do 
    ThinkingSphinx::Test.stop 
end 

,並與該代碼在每個測試案例之前,我火的搜索查詢

ThinkingSphinx::Test.index 

但還是之後我火了搜索查詢,它給我空的結果雖然精確匹配在那裏測試D b。

如果你正在使用RSpec的與thinking_sphinx

+0

我們有一個項目需要索引600k條款的TS。這是一個失敗的大桶。測試(正如你發現的)在* ss中是一個真正的痛苦。我們正在轉向使用Solr的SunSpot。 – Ariejan 2010-11-11 12:57:20

回答

4

這是由於事務燈具請指引我的代碼示例。

儘管ActiveRecord可以在單個事務中運行其所有操作,但Sphinx無法訪問該操作,因此索引不會包含事務的更改。

你必須禁用你的交易裝置。

在你rspec_helper.rb把

RSpec.configure do |config| 
    config.use_transactional_fixtures = false 
end 

在全球禁用。

Turn off transactional fixtures for one spec with RSpec 2

12

繼大衛後,我們結束了以下解決方案:

#spec/support/sphinx_environment.rb 
require 'thinking_sphinx/test' 

def sphinx_environment(*tables, &block) 
    obj = self 
    begin 
    before(:all) do 
     obj.use_transactional_fixtures = false 
     DatabaseCleaner.strategy = :truncation, {:only => tables} 
     ThinkingSphinx::Test.create_indexes_folder 
     ThinkingSphinx::Test.start 
    end 

    before(:each) do 
     DatabaseCleaner.start 
    end 

    after(:each) do 
     DatabaseCleaner.clean 
    end 

    yield 
    ensure 
    after(:all) do 
     ThinkingSphinx::Test.stop 
     DatabaseCleaner.strategy = :transaction 
     obj.use_transactional_fixtures = true 
    end 
    end 
end 

#Test 
require 'spec_helper' 
require 'support/sphinx_environment' 

describe "Super Mega Test" do 
    sphinx_environment :users do 
    it "Should dance" do 
     ThinkingSphinx::Test.index 
     User.last.should be_happy 
    end 
    end 
end 

它轉換指定的表到:截斷策略,之後,切換他們帶回:trasaction策略。

+0

如果您有任何意見,請隨時發佈。 – Max 2012-02-14 13:01:58

+0

我希望我可以多次投票。 – samullen 2012-03-20 02:03:39

+0

@Max您的代碼看起來很有希望。代碼「ThinkingSphinx :: Test.init」應該放在哪裏? Factory_Girl的數據創建代碼應放在哪裏?我無法讓他們工作。生成的結果是空的網頁。我懷疑要麼TS沒有看到數據或TS沒有開始/索引的權利。 – GeorgeW 2012-12-11 05:47:44