2010-11-11 17 views
8

Mam metodę klasy w modelu, który wywołuje metodę wyszukiwania() thinking_sphinx. Muszę sprawdzić tę metodę klasy.Jak przetestować ThinkingSphinx przy użyciu RSpec

Chcę rozpocząć, indeksować lub zatrzymać sfinksa w moich testowych przypadkach rspec. Próbuję z tym kawałkiem kodu.

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

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

iz tego kodu w każdym przypadku testowego zanim ogień zapytania

ThinkingSphinx::Test.index 

ale po tym, jak ogień zapytania, to daje mi pustych wyników chociaż dokładne mecze są tam w teście db.

proszę kierować do mnie z przykładami kodu, jeśli używasz rspec z thinking_sphinx

+0

Mamy TS w projekcie, który musi indeksować 600k artykułów. To wielkie wiadro FAIL. Testowanie (jak się dowiedziałeś) jest prawdziwym bólem w * ss. Przenosimy się do SunSpot, który wykorzystuje Solr. – Ariejan

Odpowiedz

4

Wynika to opraw transakcyjnych.

Podczas gdy ActiveRecord może uruchamiać wszystkie swoje operacje w ramach pojedynczej transakcji, Sphinx nie ma do tego dostępu, więc indeksowanie nie obejmie zmian transakcji.

Musisz wyłączyć swoje urządzenia transakcyjne.

W swojej rspec_helper.rb umieścić

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

wyłączyć globalnie.

Zobacz Turn off transactional fixtures for one spec with RSpec 2

12

Po David post, możemy skończyć z następującym roztworem:

#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 

przełączenie określone tabele: strategii obcięcia, a potem włączyć je z powrotem do: strategii trasaction.

+0

Jeśli masz jakiś komentarz, możesz je opublikować. – Max

+0

Chciałbym móc głosować to więcej niż jeden raz. – samullen

+0

@Max Twój kod wygląda obiecująco. Gdzie powinien znajdować się kod "ThinkingSphinx :: Test.init"? Gdzie powinien znajdować się kod tworzenia danych Factory_Girl? Miałem problemy z doprowadzeniem ich do pracy. Powstała pusta strona internetowa wygenerowana. Podejrzewałem, że albo TS nie widzi danych, albo TS nie jest uruchamiany/indeksowany prawidłowo. – GeorgeW

Powiązane problemy