2010-11-11 4 views
8

У меня есть метод класса в модели, которая вызывает метод mouse_sphinx search(). Мне нужно проверить этот метод класса.Как проверить ThinkingSphinx с помощью RSpec

Я хочу начать, индексировать или останавливать сфинкс в своих тестовых случаях rspec. Я пытаюсь использовать этот фрагмент кода.

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

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

и с этим кодом в каждом тесте, прежде чем я сгореть поисковый запрос

ThinkingSphinx::Test.index 

, но все еще после того, как я огонь поисковый запрос, он дает мне пустые результаты, хотя точные совпадения есть в тесте дб.

Пожалуйста, наставит меня с примерами кода, если вы используете RSpec с thinking_sphinx

+0

У нас есть TS в проекте, который должен индексировать 600 тыс. Статей. Это большое ведро FAIL. Тестирование (как вы узнали) - настоящая боль в * ss. Мы переходим к SunSpot, который использует Solr. – Ariejan

ответ

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 

Это переключение указанных таблиц: стратегии усечения, и после этого переключить их обратно: стратегии операциям Устанавливается.

+0

Если у вас есть какие-либо комментарии, не стесняйтесь публиковать их. – Max

+0

Хотел бы я проголосовать за это не один раз. – samullen

+0

@Max Ваш код выглядит многообещающим. Где должен быть размещен код «ThinkingSphinx :: Test.init»? Также где должен быть размещен код создания Factory_Girl? У меня были проблемы с их работой. Полученная пустая веб-страница сгенерирована. Я подозревал, что либо TS, не видя, что данные или TS не запускаются/не индексируются правильно. – GeorgeW

Смежные вопросы