2010-11-11 19 views
8

J'ai une méthode de classe dans un modèle qui appelle la méthode search_sphinx search(). Je dois vérifier cette méthode de classe. Je veux commencer, indexer ou arrêter le sphinx dans mes cas de test rspec. J'essaye avec ce morceau de code.Comment tester ThinkingSphinx en utilisant RSpec

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

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

et avec ce code dans chaque cas de test avant le feu de la requête de recherche

ThinkingSphinx::Test.index 

mais après je tire la requête de recherche, il me donne des résultats vides que les correspondances exactes sont là dans le test db.

S'il vous plaît me guider avec des exemples de code si vous utilisez rspec avec thinking_sphinx

+0

Nous avons TS dans un projet qui a besoin d'indexer 600k articles. C'est un gros seau de FAIL. Le test (comme vous l'avez découvert) est une vraie douleur dans le * ss. Nous passons à SunSpot, qui utilise Solr. – Ariejan

Répondre

4

Ceci est dû à accessoires transactionnels. Bien qu'ActiveRecord puisse exécuter toutes ses opérations au sein d'une même transaction, Sphinx n'y a pas accès. L'indexation n'inclut donc pas les modifications de votre transaction.

Vous devez désactiver vos appareils transactionnels.

Dans votre rspec_helper.rb mis

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

pour désactiver le monde.

Voir Turn off transactional fixtures for one spec with RSpec 2

12

Après poste David, nous nous retrouvons avec une solution suivante:

#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 

Il changer les tables spécifiées à: stratégie de troncature, et après que les Revient à: stratégie trasaction.

+0

Si vous avez des commentaires, n'hésitez pas à les poster. – Max

+0

J'aimerais pouvoir voter plus d'une fois. – samullen

+0

@Max Votre code semble prometteur. Où placer le code "ThinkingSphinx :: Test.init"? Où devrait être placé le code de création de données de Factory_Girl? J'ai eu du mal à les faire travailler. La page Web vide résultant généré. Je soupçonnais que TS ne voyant pas les données ou TS pas commencé/indexé à droite. – GeorgeW