Как проверить ThinkingSphinx с помощью RSpec - PullRequest
8 голосов
/ 11 ноября 2010

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

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

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

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

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

ThinkingSphinx::Test.index

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

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

Ответы [ 2 ]

12 голосов
/ 14 февраля 2012

После публикации Дэвида мы получаем следующее решение:

#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

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

4 голосов
/ 09 февраля 2011

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

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

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

В вашем rspec_helper.rb укажите

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

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

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

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