Как протестировать ThinkingSphinx с помощью RSpec

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

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

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

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

и с этим кодом в каждом тестовом примере перед запуском поискового запроса

ThinkingSphinx::Test.index

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

Пожалуйста, помогите мне с примерами кода, если вы используете rspec с think_sphinx


person Anand    schedule 11.11.2010    source источник
comment
У нас есть TS в проекте, которому нужно проиндексировать 600 тысяч статей. Это большое ведро НЕУДАЧ. Тестирование (как вы уже поняли) — настоящая головная боль. Мы переходим на SunSpot, который использует Solr.   -  person Ariejan    schedule 11.11.2010


Ответы (2)


Следуя сообщению Дэвида, мы получаем следующее решение:

#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

Он переключает указанные таблицы на стратегию :truncation, а после этого переключает их обратно на стратегию :trasaction.

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

Это связано с фиксацией транзакций.

В то время как ActiveRecord может выполнять все свои операции в рамках одной транзакции, Sphinx не имеет к ней доступа, поэтому индексация не будет включать изменения вашей транзакции.

Вы должны отключить свои транзакционные приборы.

В вашем rspec_helper.rb поместите

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

отключить глобально.

См. раздел Отключение фикстур транзакций для одной спецификации с помощью RSpec 2.

person David    schedule 09.02.2011