Rails : Cucumber and Webrat의 Integration Testing Thinking_sphinx- 트랜잭션 비품을 어떻게 색인합니까?

StackOverflow https://stackoverflow.com/questions/888744

문제

사용하는 검색 기능에 대한 오이/Webrat 통합 테스트를 원합니다. thinking_sphinx & sphinx 그러나 문제는 일반적인 오이 테스트 중에 데이터가로드 된 다음 트랜잭션에서 다시 롤백되므로 Thinking_Sphinx가 색인화 할 수있는 방법이 없다는 것입니다. 또는 테스트의 하위 집합에 대해 트랜잭션을 끄는 방법이 있습니까?

이 문제를 해결 했습니까?

편집 - 검색 결과를 조롱하는 것을 제안하지 마십시오. Thinking_sphinx를 포함한 모든 기능의 통합을 테스트하기 위해 통합 테스트를 원합니다.

도움이 되었습니까?

해결책

이 진술에 문제가있는 것을 본다.

일반적인 오이 테스트 중에 데이터가로드 된 다음 트랜잭션에서 롤백되므로 Thinking_Sphinx가 색인을 색인 할 수있는 방법이 없습니다.

그렇지 않을 수도 있습니다 빠른 Thinking_sphinx가 결과를 색인하게하는 것은 확실히 가능한 거래 내에서. 단일 통합 테스트이며 각 (많은) 단위 테스트에 대해 수행되지 않으므로 속도에 맞게됩니다.

이제 거래 중에 해당 재 인덱스를 트리거하는 방법을 알아 내야합니다.

# somewhere in /features/support:
before('@reindexing') do
  require 'Rake'

  class MyModel
    after_save :force_reindex!

    def force_reindex!
      # in case multiple runs of this block cause the hook
      # to get added multiple times, let's check to make sure
      # we haven't already reindexed for this save
      return if @__reindexed
      Rake["thinking_sphinx:rebuild"].execute
      @__reindexed = true
    end
  end
end

after('@reindexing') do
  class MyModel
    def force_reindex!
      # do nothing; the hook still gets called, but that's ok
    end
  end
end

~ 안에 /features/integration.feature (또는 무엇이든), 당신은 가질 것입니다

@reindexing
Feature: The whole shebang, altogether

  Scenario: ...

다른 팁

데이터베이스 클리너 플러그인을 사용하고 기능/지원/env.rb를 다음과 같이 수정하여 Sphinx를 사용하여 오이 테스트를 성공적으로 수행 할 수있었습니다.

# Sets up the Rails environment for Cucumber
ENV["RAILS_ENV"] ||= "cucumber"

...

# http://github.com/bmabey/database_cleaner
require 'database_cleaner'
DatabaseCleaner.strategy = :truncation
Before do
  DatabaseCleaner.clean
end

ThinkingSphinx::Configuration.instance.build
ThinkingSphinx::Configuration.instance.controller.start
at_exit do
  ThinkingSphinx::Configuration.instance.controller.stop
end
ThinkingSphinx.deltas_enabled = true
ThinkingSphinx.updates_enabled = true
ThinkingSphinx.suppress_delta_output = true

# Re-generate the index before each Scenario
Before do
  ThinkingSphinx::Configuration.instance.controller.index
end

보시다시피, 우리는 또한 '오이'환경과 별도의 데이터베이스를 만들었습니다 (절정과 사양을 충돌하지 않고 동시에 실행하기 위해) - '오이'를 추가해야합니다 : 'cucumber': 'database.yml 및 sphinx에 입력해야합니다. YML이라면 그렇게하고 싶다면.

레이크 작업이 별도의 프로세스에서 인덱서를 호출하고 테스트 트랜잭션 외부에 있기 때문에 연결된 제안은 작동하지 않습니다.

스핑크스 인덱스 프로세스가 새롭고 업데이트 된 레코드를 볼 수 있도록 테스트 트랜잭션을 끄는 것 외에이 주위에 어떤 방법이 있는지 모르겠습니다. 당신의 TestCase, 그냥 줄을 추가하십시오

self.use_transactional_fixtures = false

테스트가 끝날 때 데이터를 정리해야합니다.

소유하지 않는 구성 요소를 테스트하는 것이 좋습니다. 그것은 특정 버전의 SPHINX에서 특정 순위 알고리즘에 의존하기 때문에 나중에 변경 될 수 있으므로 향후 예측할 수없는 결과를 반환 할 수 있기 때문에 매우 부서지기 쉬운 테스트가 될 것입니다.

이 작업을 수행하려면 MySQL 어댑터 또는 XMLPipe2 옵션을 통해 테스트 데이터베이스를 사용하여 테스트를위한 별도의 인덱스를 실행하는 것이 좋습니다 (XML2Pipe는 SPHINX 파일에서 인덱싱 옵션을 변경하지 않고 데이터 세트를 변경할 수 있습니다). . 이를 위해서는 한 번에 테스트 데이터를 별도로 설정하고 인덱스를 삭제 한 다음 (루비 쉘 명령 사용) 인덱스를 강제로 인덱싱해야합니다 (총 색인 된 문서의 총 수가 알려진 데이터베이스 레코드의 양과 동일하게 대기합니다. ) 및 데이터에 대해 테스트를 실행하십시오.

나는 당신이 끊임없이 깨진 테스트 또는 느린 테스트 런타임을 다루어야한다고 말한 것처럼 색인 테스트에 대해 정말로주의를 기울일 것입니다 (색인화중인 데이터의 양에 따라).

이것은 아마도 가치가있는 것보다 더 번거롭지 만 델타 인덱스를 켜려고 했습니까?

제안 된 솔루션을 시도했지만 다음 오류로 Sphinx Times를 시도했습니다. 트랜잭션 비품이 활성화되는 동안 스핑크스를 다시 인덱스 할 수 있다고 생각하지 않습니다.

오류 : 인덱스 'document_core': sql_query_pre [0] : 잠금 대기 시간 초과 초과; 거래를 다시 시작하십시오

오이 태그를 사용한 오이 사고 스핑크스 테스트를 분만하기 위해 태그를 사용하는 또 다른 예 여기.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top