2010-11-11 14 views
8

Ich habe eine Klassenmethode in einem Modell, die thinking_sphinx search() -Methode aufruft. Ich muss diese Klassenmethode überprüfen.So testen Sie ThinkingSphinx mit RSpec

Ich möchte sphinx in meinen rspec Testfällen starten, indexieren oder stoppen. Ich versuche es mit diesem Code.

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

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

und mit diesem Code in jedem Fall zu testen, bevor ich schieße die Suchabfrage

ThinkingSphinx::Test.index 

aber immer noch, nachdem ich die Suchabfrage abfeuern, es mir leer Ergebnisse liefert, obwohl exakte Übereinstimmungen gibt es im Test db.

Bitte leite mich mit Code-Beispiele, wenn Sie rspec mit thinking_sphinx

+0

Wir haben TS in einem Projekt, das 600k Artikel indizieren muss. Es ist ein großer Eimer von FAIL. Testen (wie Sie herausgefunden haben) ist ein echter Schmerz in der * ss. Wir ziehen zu SunSpot, das Solr nutzt. – Ariejan

Antwort

4

zu Transaktions Vorrichtungen verwenden Dies beruht.

Während ActiveRecord alle seine Operationen innerhalb einer einzigen Transaktion ausführen kann, hat Sphinx keinen Zugriff darauf. Daher werden bei der Indexierung die Änderungen Ihrer Transaktion nicht berücksichtigt.

Sie müssen Ihre transaktionalen Fixtures deaktivieren.

In Ihrem rspec_helper.rb setzen

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

global zu deaktivieren.

Turn off transactional fixtures for one spec with RSpec 2

12

Nach David Post Siehe, erhalten wir folgende Lösung:

#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 

Es wechseln angegebenen Tabellen zu: Verkürzungsstrategie und danach wechseln sie zurück zu: trasaction Strategie.

+0

Wenn Sie einen Kommentar haben, fühlen Sie sich frei, sie zu veröffentlichen. – Max

+0

Ich wünschte, ich könnte dies mehr als einmal abstimmen. – samullen

+0

@Max Ihr Code sieht vielversprechend aus. Wo sollte der Code "ThinkingSphinx :: Test.init" platziert werden? Wo sollte auch der Datenerstellungscode von Factory_Girl platziert werden? Ich hatte Schwierigkeiten, sie zur Arbeit zu bringen. Die resultierende leere Webseite generiert. Ich vermutete, dass entweder TS nicht die Daten sehen oder TS nicht richtig gestartet/indiziert wurde. – GeorgeW